Zaman uyumsuz görev kütüphanem istisnaları sessizce yutmalı mı?


10

Ben sadece .NET 4.5 bir istisnalar Taskele nasıl bir değişiklik tanıttı öğrendim . Yani, sessizce bastırılırlar.

Bunun neden yapıldığının resmi mantığı "deneyimsiz geliştiriciler için daha dostça olmak istedik" gibi görünüyor:

.NET 4.5'te, görevler, diller tarafından desteklenen yeni zaman uyumsuzluk özelliklerinin bir parçası olarak C # ve Visual Basic dillerinde pişirildiklerinden .NET 4'te olduğundan çok daha fazla öneme sahiptir. Bu aslında Görevleri deneyimli geliştiriciler alanından herkesin alanına taşır. Sonuç olarak, istisna işleme konusunda ne kadar katı olacağına dair yeni bir dizi dengeye yol açar.

( kaynak )

.NET'teki kararların çoğunun ne yaptığını gerçekten bilen insanlar tarafından verildiğine güvenmeyi öğrendim ve karar verdikleri şeylerin arkasında genellikle çok iyi bir neden var. Ama bu benden kaçıyor.

Kendi zaman uyumsuz görev kitaplığımı tasarlıyorsam, Framework geliştiricilerinin görmediğim gördüğü istisnaları yutmanın avantajı nedir?


4
+1. İşe yarayamayacağınız istisnaları yaymamak asenkron bağlamı bir yana bile kötü bir uygulamadır. Ayrıca, deneyimsiz geliştiriciler hakkındaki tartışma oldukça topal, IMHO. Yeni başlayanlar için, sadece çalışmayan değil, aynı zamanda hiçbir istisna da getirmeyen bir kod parçasından daha garip ne olabilir?
Arseni Mourzenko

@MainMa Tam olarak düşüncelerim, ama daha önce yanılmışım (ortaya çıktığında, aslında çok iyi ama açık bir nedeni var), bu yüzden soracağımı düşündüm.
Roman Starkov

2
Vay be, bunu ilk duyduğum için yayınladığına sevindim; ve kesinlikle POLA'yı ihlal ediyor . Bu adamların gerçekten ne yaptıklarını gerçekten bildiklerinden dolayı haklısınız, bu yüzden bunun arkasında hangi akıl yürütmenin olabileceğini içtenlikle merak ediyorum ... Async'in uygulanmasına ve istisnaların nasıl yayılacağına daha teknik bir neden olup olmadığını merak ediyorum. alt bir coroutine geçiriliyor gibi ..
Jimmy Hoffa

Yanıtlar:


2

Değer verdiğiniz şey için , bağlandığınız belge gerekçelendirme olarak örnek bir durum verir:

Task op1 = FooAsync(); 
Task op2 = BarAsync(); 
await op1; 
await op2;

Bu kodda, geliştirici paralel olarak çalışması için iki eşzamansız işlem başlatır ve ardından yeni bekleme dili özelliğini kullanarak her birini eşzamansız olarak bekler ... [C] hem op1 hem de op2 hatası olursa ne olur. Op1'i beklemek op1'in istisnasını yayar ve bu nedenle op2 asla beklenmez. Sonuç olarak, op2'nin istisnası gözlenmeyecek ve süreç sonunda çökecektir.

Geliştiricilerin Görevlere dayalı eşzamansız kod yazmalarını kolaylaştırmak için .NET 4.5, gözlemlenmeyen özel durumlar için varsayılan özel durum davranışını değiştirir. Gözlenmeyen özel durumlar yine de UnobservedTaskException olayının yükseltilmesine neden olsa da (bunu yapmazsanız bir değişiklik bozulur), işlem varsayılan olarak çökmez. Daha ziyade, bir olay işleyicinin istisnayı gözlemleyip gözlemlemesine bakılmaksızın, olay gerçekleştikten sonra istisna son bulur.

Buna ikna olmadım. Belirsiz, ancak izlenmesi zor bir hata (gerçek hatadan çok sonra ortaya çıkabilecek gizemli program çökmesi) olasılığını ortadan kaldırır, ancak tamamen sessiz bir hata olasılığı ile değiştirir - bu da daha sonra izlenmesi aynı derecede zor bir sorun olabilir programınızda açık. Bu benim için şüpheli bir seçim gibi görünüyor.

Davranış yapılandırılabilir - ancak elbette, geliştiricilerin% 99'u varsayılan davranışı kullanacak, asla bu sorunu düşünmeyecek. Yani varsayılan olarak seçtikleri şey büyük bir anlaşma.


Ama yapmak için normal bir durum almak op1, sağ? Eğer bu bir kalıntısı işlenmeyen, bu olacak , doğru süreç çökertmek?
Timwi

1
@Timwi, anladığım kadarıyla, ne op1istisnası ne de op2istisnası programı yıkamazdı . Avantajı, her ikisini de gözlemleme fırsatına sahip olmanızdır. Ama eğer yapmazsanız, ikisi de yutulur. Yine de yanılmış olabilirim.

İkisini de gözlemlemenizi çok önemli bulduklarına gerçekten şaşırdım. Onları "gözlemlemek" istiyorsanız, onları yakalarsınız ve görev sonucu aracılığıyla olaylarını rapor edersiniz! ... Akıl yürütmenizle aynı
fikirde

2

TL; DR - Hayır , istisnaları sessizce görmezden gelmemelisiniz.


Varsayımlara bakalım.

  • Kör inancın

.NET'teki kararların çoğunun ne yaptığını gerçekten bilen insanlar tarafından verildiğine güvenmeyi öğrendim ve karar verdikleri şeylerin arkasında genellikle çok iyi bir neden var. Ama bu benden kaçıyor.

MS, personel üzerinde bazı gerçekten parlak insanlar var, şüphesiz. Ayrıca ... clueless ve sürekli olarak kötü kararlar veren bir takım yöneticileri ve yöneticileri var. Teknik açıdan anlayışlı bilim insanlarının ürün geliştirmeye yön veren masalına inanmak istediğimiz kadar, gerçeklik çok daha korkunç.

Demek istediğim, içgüdünüz size bir şeylerin yanlış olabileceğini söylüyorsa, bunun yanlış olması için iyi bir şans (ve geçmiş emsal) vardır.

  • Bunun teknik bir sorun olduğunu

Bu durumda istisnaların nasıl ele alınacağı teknik bir karar değil, bir insan faktörleri kararıdır. Gevşek bir istisna bir hatadır. Hata biçimlendirilmiş olsa bile hatanın sunumu son kullanıcıya kritik bilgiler sağlar. Yani bir şeyler ters gitti.

Son kullanıcı ve geliştirici arasındaki bu varsayımsal konuşmayı düşünün.

Kullanıcı: Uygulama bozuk.
Dev: Ne kırıldı?
Kullanıcı: Bilmiyorum, düğmeye tıklıyorum ve hiçbir şey olmuyor.
Dev: tarafından Ne demek hiçbir şey olmuyor?
Kullanıcı: Bak, tıklıyorum, bekliyorum ve bekliyorum ve bekliyorum ve hiçbir şey ... Açıkçası kırılmış.

Zavallı, neyse ki varsayımsal Geliştirici'miz artık olaylar zincirinde neyin yanlış gittiğini bulmak zorunda. Neredeydi?
Olay işleyici bildirimi -> Olayı işleme rutini -> İşleyici tarafından tetiklenen yöntem -> eşzamansız çağrının başlangıcı -> 7 OSI ağının katmanları -> fiziksel iletim -> 7 OSI ağının katmanlarını yedekle -> alıcı hizmet -> servis tarafından çağrılan yöntem -> ... -> servis tarafından gönderilen cevap dönüş - - .... -> asenkron makbuz -> asenkron cevap işlenmesi -> ...

Ve orada birkaç potansiyel hata yolu üzerinde parladığımı lütfen unutmayın.


Temel varsayımlardan bazılarına değindikten sonra, istisnaların sessizce bastırılmasının neden kötü bir fikir olduğu daha açık hale geliyor. Bir istisna ve ilişkili hata mesajı, kullanıcıların bir şeylerin yanlış gittiğinin önemli bir göstergesidir. Mesaj son kullanıcı için anlamsız olsa bile, gömülü bilgiler neyin yanlış gittiğini anlamada Geliştirici için yararlı olabilir. Eğer şanslılarsa, mesaj bile çözüme yönlendirir.

Buradaki sorunun bir parçası, yanlış işlenmiş bir istisnanın uygulamanızı kilitleyeceğini düşünüyorum. İstisnaları bastırarak uygulama çökmez. Bununla birlikte, zaman uyumsuzluğun, veri alınırken uygulamanın çalışmaya devam etmesine izin vermesi olduğu için bunun bir geçerliliği vardır. Sonuçlarda beklerken çalışmaya devam edebiliyorsanız, o zaman geri almadaki bir başarısızlığın uygulamayı da çökertmemesi gerektiğini söylemek mantıklı bir uzantı değildir - zaman uyumsuz çağrı örtük olarak uygulamayı sonlandıracak kadar önemli olarak bildirilmez.

Bu bir çözüm, ama yanlış sorunu çözüyor. Uygulamanın çalışmaya devam edebilmesi için özel durum işleme için bir sarıcı sağlamak çok fazla çaba sarf etmez. Kural dışı durum yakalanır, ekrana hata iletisi atılır veya günlüğe kaydedilir ve uygulamanın çalışmaya devam etmesine izin verilir. İstisnanın bastırılması, hataları görmezden gelmenin A-OK olacağını ve testinizin istisnaların hiçbir zaman alana kaçmamasını sağlayacaktır.

Bu yüzden son değerlendirmem, insanların düşüncelerini bu yaklaşıma kaydırmaya hazır olmadıklarında, eşzamansız bir modele iterek yaratılan bir sorunu çözmek için yarı pişmiş bir girişim olduğu yönündedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.