Kaynak:
docs/knowledge-base/quality/error-handling.md— KB-docs.
Hata Yönetimi (Error Handling) — ERPPRO / ERPGOLD V2
Kapsam: try/catch kalıpları ve istatistikleri, genel (unhandled) hata yakalama, hata gösterim formu, özel MessageBox, veritabanı hata günlüğü (var mı?), yutulan (swallow) hatalar, yeniden deneme, transaction/rollback, tetikleyici
RAISERROR'larının uygulamaya yansıması. Gerçeklik türü: AS-IMPLEMENTED. Etiketler: VERIFIED / INFERRED / UNKNOWN. İstatistik kaynağı:/home/claude/kb_src/erppro/scan.json(statik analiz).
1. Sayısal özet — VERIFIED (scan.json stats + metot toplamları)
| Ölçüt | Değer | Kaynak |
|---|---|---|
| Dosya / sınıf / metot / satır | 1.029 / 3.426 / 16.043 / 372.436 | scan.json stats |
Try blokları |
965 | metot tries toplamı |
Catch blokları |
914 | metot catches toplamı |
Boş catch (empty_catch) |
679 (catch'lerin %74'ü); 660 metotta | scan.json stats.empty_catch |
Throw |
43 (scan) / 44 (grep); 32'si ERPGOLDV2DataSet.Designer.vb (üretilmiş kod), 4'ü Class/Dao/_SQLBase/SQLBase.vb — iş kodunda fiilen yeniden fırlatma yok |
grep ^\s*Throw |
MsgBox(ex.Message) |
82 | grep |
MessageBox.Show(ex.Message… |
9 | grep |
My.Application.ShowDebugOutput(ex) çağrısı |
22 | grep |
On Error Resume Next |
11 | grep |
| Transaction kullanan metot | 1 (TableAdapterManager.UpdateAll, üretilmiş kod) |
scan.json transaction; grep SqlTransaction|BeginTransaction → yalnız ERPGOLDV2DataSet.Designer.vb |
SqlTransaction iş kodunda |
0 | grep |
Boş catch dağılımı (ilk 8): ERPPRO/Class/Dao 361, CodeDesigner 43, Designer/ReportManager 39, Controls/Islem Ekranı 33, Class/Module 30, Class/Ext 24, Form/Siparis 18, Controls/Takvim 16. → Boş catch'lerin yarısından fazlası veri erişim katmanındadır.
2. Katmanlara göre kalıplar
2.1 InternalDb (Class/Module/InternalDb.vb) — VERIFIED
Tüm DAO'ların kullandığı ADO.NET sarmalayıcı. Hata yakalama:
- SqlConnectionState set (:37-51): Open/Close hatasında ConnectionError bayrağı ile tek seferlik "Sunucuya Ulaşılamıyor. Lütfen Network Bağlantısını Kontrol Ediniz." mesajı; istisna yutulur.
- ExecuteNonQuery (:53-67), ExecuteScalar (:69-83), DataReader (:85-98), DataSet (:100-111), DataTable (:113-125): Catch ex As Exception → MsgBox(ex.Message); sonuç Nothing (ya da boş) döner. İstisna yeniden fırlatılmaz, loglanmaz.
- Sonuç: SQL hataları (kısıt ihlali, tetikleyici RAISERROR, zaman aşımı) kullanıcıya ham SQL mesajı olarak MsgBox ile gösterilir; çağıran kod yalnız Nothing/0 görür.
2.2 DAO Insert/Update kalıbı (üretilmiş şablon) — VERIFIED
Örnek: Class/Dao/Sistem.Users.vb:127-173
Using db As New InternalDb("Insert Into … SELECT SCOPE_IDENTITY")
… Parameters.AddWithValue …
Try
RecId = db.ExecuteScalar
Catch ex As Exception
Finally
db.SqlConnectionState = InternalDb.IDbConnectionState.Close
End Try
End Using
If RecId > 0 Then … Return True Else Return False
- İç
Catchboştur; zatenInternalDb.ExecuteScalarkendi içinde yutup MsgBox gösterdiğinden bu catch yalnızNothing → Integerdönüşümü gibi ikincil hataları yutar.SaveFalse döner, sebep kaybolur (çağıranIf Save = True … Elseile yalnız başarısızlığı bilir). - Aynı kalıp
New(GetId)yükleyicilerde:DataReaderdöngüsüTry/Catchboş (ör. Sistem.Users.vb:51-53, Sistem.LoginUser.vb:42-44) → kayıt bulunamazsa veya kolon yoksa nesne sessizce boş kalır (Id=0).
2.3 Form/kontrol katmanı — VERIFIED
Try … Catch ex As Exception: MsgBox(ex.Message)(82 yer) — ör.FrmLoginForm.FormInit(:58-60),GlobalSettings.Read(Settings.vb:113-118).Catch ex As Exception: My.Application.ShowDebugOutput(ex)(22 yer) — ör.Program.Init(Program.vb:241-243).- Boş catch (UI):
Program.UiDesigner_RibbonItemClick(Program.vb:282-283),iTabControl_ControlAdded(iTabControl.vb:48-53),Utils.CallLisansControl(Utils.vb:194-196). - Özel
Messagesınıfı (Class/Other/MessageBox.vb:1-40):Message.Show(MessageType)sabit Türkçe metinler (Save, Close, NotSelectedRecord, DeleteRecord, FileNotFound, IncorrectPassword, SaveRequried) veShow(Message, Title, Button, Icon)sarmalayıcı →Windows.Forms.MessageBox. Hata gösterimi için değil, onay/bilgi için kullanılır; adıMessage, dosya adıMessageBox.vb.
2.4 İş kuralı ihlalleri — VERIFIED
İstisna yerine MessageBox.Show(...) + Return False/Exit Sub. Örnek: Cari.Islem.Save (Class/Dao/Islem/Cari.Islem.vb:506-526): "Sube,Kasa veya Hesap Seçili Değil…", "İşlem Yapabilmek için Miktar Girmelisiniz.", "Hesap Limiti Aşılıyor…". Yetki mesajları: iScreen.vb:594-597, 730-733.
3. Genel (unhandled) hata yakalama — VERIFIED
ERPPRO/ApplicationEvents.vbboştur (yalnız şablon yorumları, :1-15). Ancak aynıPartial Friend Class MyApplicationsınıfının ikinci parçasıClass/Ext/ApplicationExt.vb'dedir ve şunları tanımlar:MyApplication_Startup(:23-37):AddHandler AppDomain.CurrentDomain.UnhandledException(:24) veApplication.ThreadException(:25).app_ThreadException(:38-44): UI thread'eInvokeederekShowDebugOutput(e.Exception).AppDomain_UnhandledException(:45-47) veMyApplication_UnhandledException(Handles Me.UnhandledException, :48-50) →ShowDebugOutput. → Sonuç: UnhandledException handler'ı vardır, amaApplicationEvents.vb'de değilApplicationExt.vb'dedir.ShowDebugOutput(ex)(:14-21): yalnızProgram.UserSettings.AutoErrorHandle = 1ise (Kullanıcı Ayarları → "Hata Yakala: Evet", FrmUserSettings.Designer.vb:324)On Error Resume NextaltındaStackTraceçıkarır veExeptionForm.Show(...)gösterir.AutoErrorHandle = 0(varsayılan int 0) ise hiçbir şey yapılmaz → hata sessizce kaybolur (loglanmaz).- INFERRED:
StartupsırasındaProgram.UserSettingshenüzNothing'dir (FrmLoginForm.New:10'da atanır); bu aralıkta oluşan bir unhandled exceptionShowDebugOutputiçindeNullReferenceExceptionüretir — davranış UNKNOWN (test edilmedi).
3.1 ExeptionForm (Form/Genel/FrmExeption.vb:1-18) — VERIFIED
Show(Error, ErrorType, Module, Method, LineNumber, Details): etiketler +MemoEdit1 = ex.ToString; modal.BtnKapat → End(:15-17): pencere kapatılınca uygulama sonlanır. YaniProgram.Initgibi try/catch ile yakalanıpShowDebugOutput'a verilen hatalar, "Hata Yakala=Evet" ise programı kapatır; "Hayır" ise sessizce devam eder (yarım başlatılmış durum — INFERRED).Imports System.Net.Mailvardır ama e-posta gönderimi yoktur (kullanılmayan import) — VERIFIED.- Hata ekranında gönder/kopyala/logla işlevi yoktur.
4. Hata günlüğü (log) var mı? — VERIFIED
| Mekanizma | Durum |
|---|---|
DB tablosu Sistem.Exception (Id, LogType, CreatedDate, ActiveModule, TransactionId, Description, Feedback, UserId) |
Var, 0 satır (tables.json). |
DAO AIO.Sistem.İexception (Class/Dao/Sistem.iException.vb, cp1254) |
Var; Save Insert Into Sistem.iException(...) yazar (:96-98) — tablo adı Sistem.iException DB'de yok (tables.json'da yalnız Sistem.Exception). Sınıf hiçbir yerden çağrılmıyor (grep İexception|iexception|Sistem.iException → yalnız tanım). → Günlükleme fiilen yok. |
Sistem.Log / Sistem.ErrorLog tablosu |
Yok (tables.json'da Sistem.Login var — giriş kaydı, hata değil). |
My.Application.Log / FileLogTraceListener |
app.config:14-33 içinde FileLog dinleyicisi tanımlı (DefaultSwitch=Information), ancak kodda My.Application.Log. çağrısı yok (grep) → yalnız çerçeve tarafından yazılabilecek olaylar; uygulama hatası yazılmaz. |
Sistem.Login.Status |
Giriş başarı/başarısızlığı ("Success!" / "Incorrect Password!") — Login.vb:36, 40. |
Cari.AccountLog |
Hesap seçim denetimi (iHesapControl.vb:89) — hata değil. |
Sistem.Nabiz, Sistem.Tracker, Sistem.Activity |
Tablolar mevcut; amaçları UNKNOWN (bu dokümanda incelenmedi). |
Sonuç: Uygulama hatalarının kalıcı bir kaydı yoktur; hata ya MsgBox ile gösterilir ya da yutulur.
5. Yutulan (swallow) hatalar — 10 kritik örnek (VERIFIED, dosya:satır = boş Catch)
| # | Yer | Etki |
|---|---|---|
| 1 | Class/Dao/Islem/Cari.Islem.vb:697 (Insert) |
Cari işlem INSERT + Cari.RsAktar çağrısı; hata → Save=False, sebep yalnız InternalDb MsgBox'ında |
| 2 | Class/Dao/Islem/Cari.Islem.vb:990 (Update) |
Cari işlem UPDATE + Takoz.RaporYaz; aynı |
| 3 | Class/Dao/Islem/Cari.Islem.vb:122 (New(GetId)) |
İşlem yüklenemezse boş nesne ile devam |
| 4 | Class/Dao/Islem/ERPFatura.vb:486 (Save) |
E-fatura kaydı (Cari.IslemDetaylari) sessiz başarısızlık |
| 5 | Class/Dao/Cari.Fatura.vb:231 (Insert, Cari.FaturaYaz sonrası) |
Fatura kaydı / yazdırma proc hatası kaybolur |
| 6 | Class/Dao/Sistem.Users.vb:161 (Insert), :207 (Update) |
Kullanıcı/parola kaydı sessiz başarısızlık (FrmSifreDegistir yalnız Save=True ise mesaj verir, :50-54) |
| 7 | Class/Dao/Sistem.Sube.vb:368 (Insert), :529 (Update) |
Şube kaydı (ShadowMode bu Update'i kullanır, Program.vb:48) — başarısızlık bildirilmez |
| 8 | Class/Dao/Stok.Takoz.vb:354 (Insert), :413 (Update) |
Takoz stok kaydı |
| 9 | Class/Dao/Stok.Mutabakat.vb:104 (Insert) ve Delete'ler |
Mutabakat kaydı/silme |
| 10 | Class/Dao/Sistem.Pincode.vb:59 (Send) |
PIN üretimi; her iki dalda Return True (:52-56) → ekleme başarısız olsa da "başarılı" |
| + | Class/Dao/Sistem.Usergroup.vb:108 (LoadPermission) |
Bozuk yetki dizesi → tüm bayraklar False, sessiz |
| + | Class/Module/Crypto.vb:44, 113 |
Şifreleme/çözme hatası → ""/Nothing → parola boş kaydedilebilir / karşılaştırma başarısız |
| + | Class/Ext/Sistem.LoginUser.vb:42 |
Giriş kullanıcısı yüklenemezse boş nesne → "Hatalı Şifre." |
| + | Configuration/ConfigurationForm.vb:317, 345, 363 |
Config.cfg okuma/şifre çözme hataları sessiz |
| + | Class/Lisans/Lisans.vb:105, 117, 124 |
Donanım kimliği bileşenleri alınamazsa "" → seri numarası değişir |
Not: Login.vb:5-18 (SaveLogin) içinde Function değer döndürmüyor (Return yok; VB varsayılan False) — INFERRED derleyici uyarısı; hata etkisi yok.
6. Yeniden deneme (retry) — VERIFIED
Cari.Islem.AfterInsert(Class/Dao/Islem/Cari.Islem.vb:1180-1190): Provizyon gönderimi başarısızsa "Provizyon İşlemi Kayıt Edilemedi. Tekrar Denemek İstiyor musunuz?" →GoTo Tekrar(kullanıcı onaylı sonsuz döngü).Cari.Hesap.CloseAllForm(Class/Dao/Cari.Hesap.vb:811-818):GoTo Tekrar— sekme kapatma sonrası koleksiyon yeniden taraması (hata değil, koleksiyon değişimi).- Otomatik/zamanlı retry (bağlantı kopması vb.) yoktur.
InternalDb.SqlConnectionStatebağlantı hatasını bir kez bildirir, tekrar denemez (:37-51).
7. Transaction / rollback — VERIFIED
- İş kodunda
SqlTransaction,BeginTransaction,TransactionScopekullanılmaz (grep; tek eşleşme üretilmişERPGOLDV2DataSet.Designer.vb:1588-1992). - Çok adımlı kayıtlar (ör.
Cari.Islem.Insert→ INSERT +Cari.RsAktar;Cari.Fatura.Insert→ INSERT +Cari.FaturaYaz;Program.AfterSave→ iki UPDATE, Program.vb:8-19) ayrı otomatik-commit komutlarıdır → kısmi kayıt riski (INFERRED). - Bütünlük büyük ölçüde DB tetikleyicilerine bırakılmıştır (aşağıda).
8. Tetikleyici RAISERROR'larının uygulamaya yansıması — VERIFIED
DB'de 12 tetikleyiciden 5'i RAISERROR içerir (Kaynak: kb_src/db/modules_all.json):
| Tetikleyici | Mesaj(lar) |
|---|---|
| Cari.AcceptTransaction | "ISLEMLERI DIREK SILEMEZSINIZ ?.", "SUBE PASIF HALDE. ISLEM YAPAMAZSINIZ...", "E-DOVIZ FATURASI GONDERILMIS ISLEMLER DUZELTILEMEZ ..." |
| Uretim.TrBakiyeHesapla | "ISLEMLERI DIREK SILEMEZSINIZ ?." |
| Cari.HesapInsert | "Aynı Vergi No ya sahip başka bir hesap mevcuttur!" |
| Cari.HesapUpdate | "Aynı Vergi No ya sahip başka bir hesap mevcuttur!!", "Yetkiniz yoktur!" |
| Siparis.Kontrol | "LUTFEN KATEGOR SECINIZ?.", "HESAP SECMEDEN KAYIT EDEMEZSINIZ?." |
Akış (INFERRED, kod yolundan): RAISERROR → SqlException → InternalDb.ExecuteScalar/ExecuteNonQuery catch → MsgBox(ex.Message) (ham mesaj, başlıksız) → Nothing döner → DAO RecId = 0 → Save = False → çağıran form genellikle sessiz kalır (ör. FrmSifreDegistir yalnız başarıda mesaj verir). Kullanıcı mesajı görür ama uygulama hangi kuralın ihlal edildiğini programatik olarak bilmez; Description/kod ayrımı yoktur. RAISERROR severity/ROLLBACK ayrıntısı bu dokümanda incelenmedi → tetikleyici içi rollback davranışı UNKNOWN (→ database/triggers/ dokümanları).
9. Değerlendirme (INFERRED)
| Sorun | Kanıt | Sonuç |
|---|---|---|
| Boş catch'lerin DAO'da yoğunlaşması (361) | scan.json | Veri kaybı/kısmi kayıt sessizce oluşabilir |
Save False/sebep yok |
§2.2, §5 | Kullanıcı arayüzü "kaydedilmedi"yi çoğu yerde bildirmez |
Kalıcı hata günlüğü yok; Sistem.Exception 0 satır, DAO yanlış tabloya yazıyor ve çağrılmıyor |
§4 | Üretim hatalarının izi yok |
Hata gösterimi kullanıcı ayarına bağlı (AutoErrorHandle) ve kapatınca End |
§3 | Ya sessiz ya da uygulamayı kapatan hata penceresi |
| Ham SQL mesajları kullanıcıya | §2.1, §8 | Teknik metin, Türkçe/İngilizce karışık |
| Transaction yok | §7 | Çok adımlı işlemlerde tutarsızlık riski |
On Error Resume Next (11) |
grep | Eski VB kalıbı; hataları maskeler |
10. Kanıt listesi
/home/claude/kb_src/erppro/scan.json—stats(empty_catch 679, methods 16043 …), metot bazlıtries/catches/empty_catch/throws/transaction.ERPPRO/Class/Module/InternalDb.vb:37-51, 53-67, 69-83, 85-98, 100-125ERPPRO/Class/Dao/Sistem.Users.vb:28-54, 127-173, 177-218;ERPPRO/Class/Ext/Sistem.LoginUser.vb:19-46ERPPRO/Class/Dao/Islem/Cari.Islem.vb:33-125, 506-526, 566-710 (697), 711, 857-1002 (990), 1180-1190ERPPRO/Class/Dao/Islem/ERPFatura.vb:328-497 (486);ERPPRO/Class/Dao/Cari.Fatura.vb:179-243 (231);ERPPRO/Class/Dao/Sistem.Sube.vb:368, 529;ERPPRO/Class/Dao/Stok.Takoz.vb:354, 413;ERPPRO/Class/Dao/Stok.Mutabakat.vb:104;ERPPRO/Class/Dao/Sistem.Pincode.vb:46-64;ERPPRO/Class/Dao/Sistem.Usergroup.vb:108-110;ERPPRO/Class/Dao/Cari.Hesap.vb:811-818ERPPRO/Class/Module/Crypto.vb:44, 113;ERPPRO/Class/Lisans/Lisans.vb:105, 117, 124, 156;ERPPRO/Configuration/ConfigurationForm.vb:317, 345, 363ERPPRO/Class/Module/Program.vb:8-19, 198-245 (241-243), 271-283;ERPPRO/Class/Module/Utils.vb:177-197;ERPPRO/Class/Module/Login.vb:5-18ERPPRO/ApplicationEvents.vb:1-15;ERPPRO/Class/Ext/ApplicationExt.vb:11-51ERPPRO/Form/Genel/FrmExeption.vb:1-18;ERPPRO/Class/Other/MessageBox.vb:1-40ERPPRO/Form/Settings/FrmUserSettings.vb:48, 98;FrmUserSettings.Designer.vb:324;ERPPRO/Class/Dao/Sistem.Clients.vb(AutoErrorHandle kolonu)ERPPRO/Class/Dao/Sistem.iException.vb:18-30, 96-98(cp1254;iconv -f cp1254 -t utf-8ile okundu)ERPPRO/app.config:14-33;ERPPRO/ERPGOLDV2DataSet.Designer.vb:1588-1992(tek transaction, üretilmiş)ERPPRO/Form/Genel/FrmLoginForm.vb:58-60;ERPPRO/Form/Settings/Settings.vb:113-118;ERPPRO/Controls/Islem Ekranı/Ekran/iTabControl.vb:48-53;ERPPRO/Form/Users/FrmSifreDegistir.vb:50-54- DB: tetikleyici tanımları ve
Sistem.Exceptiontablosu —kb_src/db/modules_all.json,tables.json,columns.json
11. Bilinmeyenler (UNKNOWN)
- Tetikleyicilerdeki
RAISERRORseverity değerleri veROLLBACKkullanımı (→ database/triggers dokümanları). Cari.Islem.InsertWith(Connection)çağıran tarafın transaction yönetimi.Sistem.Nabiz,Sistem.Tracker,Sistem.Activitytablolarının günlükleme amacıyla ilgisi.AutoErrorHandlealanının sahadaki tipik değeri (0 mı 1 mi) —realdata.jsonbu tabloyu içermiyor.FileLogTraceListenertarafından fiilen bir dosya yazılıp yazılmadığı (çerçeve, yalnızMy.Application.Logçağrıları ile yazar; kodda çağrı yok).DijitalFaturaprojesindekiThrowkullanımlarının ana uygulamada nasıl yakalandığı (entegratör hatalarıCari.Islem.vb:1133"Entegrator Faturayı İptal Edemedi." gibi mesajlarla gösteriliyor; tam akış incelenmedi).On Error Resume Nextkullanılan 11 yerin tam listesi ve etkisi.
