Saat ini saya sedang refactoring subsistem besar dengan arsitektur multi-layered, dan saya berjuang untuk merancang strategi logging kesalahan \ penanganan yang efektif.
Katakanlah arsitektur saya terdiri dari tiga lapisan berikut:
- Antarmuka Umum (Pengontrol MVC)
- Lapisan Domain
- Lapisan Akses Data
Sumber kebingungan saya adalah di mana saya harus mengimplementasikan kesalahan logging \ handling:
Solusi termudah adalah menerapkan penebangan di tingkat atas (yaitu Pengendali Antarmuka Publik \ MVC). Namun ini terasa salah karena itu berarti meluapkan pengecualian melalui lapisan yang berbeda, dan kemudian mencatatnya; daripada mencatat pengecualian pada sumbernya.
Mencatat pengecualian pada sumbernya jelas merupakan solusi terbaik karena saya memiliki informasi paling banyak. Masalah saya dengan hal ini adalah bahwa saya tidak dapat menangkap setiap pengecualian pada sumber tanpa menangkap SEMUA pengecualian, dan pada lapisan antarmuka domain / publik, ini akan mengarah pada menangkap pengecualian yang telah ditangkap, dicatat dan dilemparkan kembali oleh lapisan di bawah .
Strategi lain yang mungkin adalah campuran # 1 dan # 2; di mana saya menangkap pengecualian khusus pada layer mereka kemungkinan besar akan dibuang (IE Catching, logging and re-throwing
SqlExceptions
di Layer Akses Data) dan kemudian mencatat pengecualian yang tidak tertangkap lebih lanjut di level atas. Namun ini juga akan mengharuskan saya untuk menangkap dan me-relog setiap pengecualian di tingkat atas, karena saya tidak dapat membedakan antara kesalahan yang telah dicatat \ ditangani dengan yang tidak.
Sekarang, jelas ini adalah masalah di sebagian besar aplikasi perangkat lunak, jadi harus ada solusi standar untuk masalah ini yang menghasilkan pengecualian yang ditangkap pada sumbernya, dan dicatat sekali; namun saya tidak bisa melihat bagaimana melakukannya sendiri.
Catatan, judul pertanyaan ini sangat mirip dengan ' Pengecualian pencatatan dalam aplikasi multi-tier " ', namun jawaban dalam posting itu kurang detail dan tidak cukup untuk menjawab pertanyaan saya.
The easiest solution would be to implement the logging at the top level
- melakukan hal ini. Mengecualikan pengecualian pada sumbernya bukan ide yang baik dan setiap aplikasi yang saya temui melakukan hal ini adalah PITA untuk debug. Seharusnya menjadi tanggung jawab penelepon untuk menangani pengecualian.
try{ ... } catch(Exception ex) { Log(ex); }
akan menghasilkan pengecualian yang sama dicatat pada setiap layer. (Sepertinya ini agak buruk untuk menangkap setiap pengecualian pada setiap lapisan dalam basis kode.)