AIFA AKADEMI · Kurumsal Wiki
4.310 makale
Ana sayfa Kurumsal Wiki › Kalite ve teknik borç › QA-ERROR-HANDLING

Hata Yönetimi

QUALITYERPGOLD_COREACTIVEHIGHSOURCE_IMPLEMENTED
Kanonik kaynak: markdown · bu sayfa üretilmiş görünümdür

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.vbiş 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
  • İç Catch boştur; zaten InternalDb.ExecuteScalar kendi içinde yutup MsgBox gösterdiğinden bu catch yalnız Nothing → Integer dönüşümü gibi ikincil hataları yutar. Save False döner, sebep kaybolur (çağıran If Save = True … Else ile yalnız başarısızlığı bilir).
  • Aynı kalıp New(GetId) yükleyicilerde: DataReader döngüsü Try/Catch boş (ö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 Message sınıfı (Class/Other/MessageBox.vb:1-40): Message.Show(MessageType) sabit Türkçe metinler (Save, Close, NotSelectedRecord, DeleteRecord, FileNotFound, IncorrectPassword, SaveRequried) ve Show(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.vb boştur (yalnız şablon yorumları, :1-15). Ancak aynı Partial Friend Class MyApplication sı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) ve Application.ThreadException (:25).
  • app_ThreadException (:38-44): UI thread'e Invoke ederek ShowDebugOutput(e.Exception).
  • AppDomain_UnhandledException (:45-47) ve MyApplication_UnhandledException (Handles Me.UnhandledException, :48-50) → ShowDebugOutput. → Sonuç: UnhandledException handler'ı vardır, ama ApplicationEvents.vb'de değil ApplicationExt.vb'dedir.
  • ShowDebugOutput(ex) (:14-21): yalnız Program.UserSettings.AutoErrorHandle = 1 ise (Kullanıcı Ayarları → "Hata Yakala: Evet", FrmUserSettings.Designer.vb:324) On Error Resume Next altında StackTrace çıkarır ve ExeptionForm.Show(...) gösterir. AutoErrorHandle = 0 (varsayılan int 0) ise hiçbir şey yapılmaz → hata sessizce kaybolur (loglanmaz).
  • INFERRED: Startup sırasında Program.UserSettings henüz Nothing'dir (FrmLoginForm.New:10'da atanır); bu aralıkta oluşan bir unhandled exception ShowDebugOutput içinde NullReferenceException ü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. Yani Program.Init gibi try/catch ile yakalanıp ShowDebugOutput'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.Mail vardı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.SqlConnectionState bağlantı hatasını bir kez bildirir, tekrar denemez (:37-51).

7. Transaction / rollback — VERIFIED

  • İş kodunda SqlTransaction, BeginTransaction, TransactionScope kullanı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): RAISERRORSqlExceptionInternalDb.ExecuteScalar/ExecuteNonQuery catch → MsgBox(ex.Message) (ham mesaj, başlıksız) → Nothing döner → DAO RecId = 0Save = 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.jsonstats (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-125
  • ERPPRO/Class/Dao/Sistem.Users.vb:28-54, 127-173, 177-218; ERPPRO/Class/Ext/Sistem.LoginUser.vb:19-46
  • ERPPRO/Class/Dao/Islem/Cari.Islem.vb:33-125, 506-526, 566-710 (697), 711, 857-1002 (990), 1180-1190
  • ERPPRO/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-818
  • ERPPRO/Class/Module/Crypto.vb:44, 113; ERPPRO/Class/Lisans/Lisans.vb:105, 117, 124, 156; ERPPRO/Configuration/ConfigurationForm.vb:317, 345, 363
  • ERPPRO/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-18
  • ERPPRO/ApplicationEvents.vb:1-15; ERPPRO/Class/Ext/ApplicationExt.vb:11-51
  • ERPPRO/Form/Genel/FrmExeption.vb:1-18; ERPPRO/Class/Other/MessageBox.vb:1-40
  • ERPPRO/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-8 ile 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.Exception tablosu — kb_src/db/modules_all.json, tables.json, columns.json

11. Bilinmeyenler (UNKNOWN)

  • Tetikleyicilerdeki RAISERROR severity değerleri ve ROLLBACK kullanımı (→ database/triggers dokümanları).
  • Cari.Islem.InsertWith(Connection) çağıran tarafın transaction yönetimi.
  • Sistem.Nabiz, Sistem.Tracker, Sistem.Activity tablolarının günlükleme amacıyla ilgisi.
  • AutoErrorHandle alanının sahadaki tipik değeri (0 mı 1 mi) — realdata.json bu tabloyu içermiyor.
  • FileLogTraceListener tarafından fiilen bir dosya yazılıp yazılmadığı (çerçeve, yalnız My.Application.Log çağrıları ile yazar; kodda çağrı yok).
  • DijitalFatura projesindeki Throw kullanı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 Next kullanılan 11 yerin tam listesi ve etkisi.