Bazı bölümlerinin çalışma zamanında istisnalar atabileceği bir WPF uygulamamız var. Küresel olarak işlenmeyen bir istisna yakalamak ve bunları günlüğe kaydetmek istiyorum, ancak aksi takdirde hiçbir şey olmamış gibi program yürütmeye devam etmek istiyorum (VB'ler gibi On Error Resume Next
).
Bu C # ile mümkün mü? Ve eğer öyleyse, istisna işleme kodunu tam olarak nereye koymam gerekir?
Şu anda ben try
/ catch
etrafında sarmak ve oluşabilecek tüm istisnaları yakalar tek bir nokta göremiyorum . Ve o zaman bile, yakalama nedeniyle yürütülen her şeyi bırakmış olurdum. Yoksa burada korkunç yanlış yönlerde mi düşünüyorum?
ETA: Aşağıdaki birçok kişi işaret etti: Uygulama nükleer santralleri kontrol etmek için değil. Eğer çökerse o kadar büyük bir şey değil ama çoğunlukla UI ile ilgili rastgele istisnalar, kullanılacağı bağlamda bir sıkıntıdır. Bunlardan birkaç tane vardı (ve muhtemelen hala) ve bir eklenti mimarisi kullandığından ve başkaları tarafından genişletilebildiğinden (bu durumda öğrenciler de; bu nedenle tamamen hatasız kod yazabilen deneyimli geliştiriciler yok ).
Yakalanan istisnalar gelince: Onları tam yığın izleme de dahil olmak üzere bir günlük dosyasına günlüğe kaydederim. Bu egzersizin bütün mesele buydu. VB'nin OERN'ine benzetimimi yapan insanlara tam anlamıyla karşı çıkmak için.
Bazı hata sınıflarını körü körüne görmezden gelmenin tehlikeli olduğunu ve uygulama örneğimi bozabileceğini biliyorum. Daha önce de belirtildiği gibi, bu program herkes için kritik bir iş değildir. Doğru akıllarında hiç kimse, insan medeniyetinin hayatta kalmasına bahse girmez. Sadece bazı tasarım yaklaşımlarını test etmek için küçük bir araçtır. yazılım Mühendisliği.
Uygulamanın hemen kullanımı için, bir istisnada gerçekleşebilecek çok fazla şey yoktur:
- İstisna işleme yok - hata iletişim kutusu ve uygulama çıkışı. Muhtemelen başka bir konuda deney tekrarlanmalıdır. Hiç hata kaydedilmedi, bu talihsiz bir durum.
- Genel istisna işleme - iyi huylu hata sıkıştı, zarar verilmedi. Bu, geliştirme sırasında gördüğümüz tüm hatalardan yargılanan genel bir durum olmalıdır. Bu tür hataları göz ardı etmenin derhal bir sonucu olmamalıdır; Çekirdek veri yapıları bundan kolayca kurtulabilecek kadar iyi test edilmiştir.
- Genel istisna işleme - ciddi bir hata sıkıştı, muhtemelen sonraki bir noktada çökebilir. Bu nadiren olabilir. Daha önce hiç görmedik. Hata yine de günlüğe kaydedilir ve bir kilitlenme kaçınılmaz olabilir. Yani bu kavramsal olarak ilk duruma benzer. Bunun dışında bir yığın izimiz var. Ve çoğu durumda kullanıcı fark etmez bile.
Program tarafından oluşturulan deney verilerine gelince: Ciddi bir hata en kötü ihtimalle hiçbir verinin kaydedilmesine neden olmaz. Deneyin sonucunu bu kadar az değiştiren küçük değişiklikler pek olası değildir. Ve bu durumda bile, sonuçlar şüpheli görünüyorsa hata günlüğe kaydedilir; eğer toplam bir aykırı değerse, bu veri noktasını yine de atabilir.
Özetlemek gerekirse: Evet, kendimi hala en azından kısmen aklı başında görüyorum ve programın tümüyle kötü olmasını sağlayan bir global istisna işleme rutini düşünmüyorum. Daha önce iki kez söylendiği gibi, uygulamaya bağlı olarak böyle bir karar geçerli olabilir. Bu durumda, tam ve mutlak bir karar değil, geçerli bir karar olarak değerlendirildi. Diğer tüm başvurularda bu karar farklı görünebilir. Ama lütfen beni veya bu projede çalışan diğer insanları, sadece hataları görmezden geldiğimiz için dünyayı patlatmakla suçlamayın.
Yan not: Bu uygulama için tam olarak bir kullanıcı var. Milyonlarca kullanıcı tarafından istisnalar balonunun maliyetinin ilk etapta çok farklı olacağı milyonlarca kişi tarafından kullanılan bir şey değil.
On Error Resume Next
C # VB benzeri kod akışının mümkün olmadığını eklemek istiyorum . Bir Exception
(C # "hataları" içermedikten sonra) bir sonraki ifadeyle devam edemezsiniz: yürütme bir catch
blokta veya aşağıdaki cevaplarda açıklanan olay işleyicilerinden birinde devam eder .