Application.ThreadException ve AppDomain.CurrentDomain.UnhandledException arasındaki fark nedir?


107

Pekala, bu çok kolay:

  • Arasındaki fark nedir Application.ThreadExceptionve
    AppDomain.CurrentDomain.UnhandledException?

  • İkisini de halletmem gerekiyor mu?

Teşekkürler!

Yanıtlar:


98

Application.ThreadException, Windows Forms'a özeldir. Winforms, kendisine Windows tarafından gönderilen iletilere yanıt olarak olay işleyicileri çalıştırır. Örneğin Click olayı, onları bildiğinizden eminim. Böyle bir olay işleyicisi bir istisna atarsa, Winforms mesaj döngüsünün içinde bu istisnayı yakalayan bir geri durdurma vardır.

Bu geri döndürmez, Application.ThreadException olayını tetikler . Bunu geçersiz kılmazsanız , kullanıcı bir ThreadExceptionDialog alacaktır . Bu, istisnayı görmezden gelmesine ve programınızı çalıştırmasına izin verir. Harika bir fikir değil btw.

Program.cs içindeki Main () yönteminde Application.SetUnhandledExceptionMode () öğesini çağırarak bu davranışı devre dışı bırakabilirsiniz . Geri döndürmez kilit olmadan, iş parçacığı işlenmemiş bir istisnadan öldüğünde olağan şey olur: AppDomain.UnhandledException tetiklenir ve program sona erer.

Fwiw: "ThreadException" çok kötü bir isim seçimiydi. İplerle ilgisi yok.


Ve WinForms uygulamasının Application.ThreadException. Bunun için [burada ] küçük C # kodumla bir soru sordum .
Mahesha999

2
Winforms'un tek bir iş parçacığına bağlı olduğu göz önüne alındığında bunu her zaman Application-thread istisnası olarak okudum.
Gusdor

36

Gönderen kaynağı :

Windows Forms kullanan uygulamalarda, ana uygulama iş parçacığındaki işlenmemiş özel durumlar Application.ThreadException olayın ortaya çıkmasına neden olur . Bu olay işlenirse, varsayılan davranış, uygulama bilinmeyen bir durumda bırakılmasına rağmen işlenmeyen istisnanın uygulamayı sonlandırmamasıdır. Bu durumda UnhandledException olay gündeme getirilmez. Bu davranış, uygulama yapılandırma dosyası kullanılarak veya olay işleyicisi bağlanmadan önce Application.SetUnhandledExceptionModemodu değiştirme yöntemi kullanılarak değiştirilebilir . Bu yalnızca ana uygulama iş parçacığı için geçerlidir. Olay diğer parçacıkları atılan işlenmeyen özel durumlar için yükseltilir.UnhandledExceptionMode.ThrowExceptionThreadExceptionUnhandledException

Visual Studio 2005'ten başlayarak , Visual Basic uygulama çerçevesi, ana uygulama iş parçacığındaki işlenmemiş özel durumlar için başka bir olay sağlar - WindowsFormsApplicationBase.UnhandledException. Bu olay, AppDomain.UnhandledException tarafından kullanılan olay arguments nesnesiyle aynı ada sahip, ancak farklı özelliklere sahip bir olay arguments nesnesine sahiptir. Özellikle, bu olay argümanları nesnesi, ExitApplicationuygulamanın çalışmaya devam etmesine, işlenmeyen istisnayı yok sayarak (ve uygulamayı bilinmeyen bir durumda bırakmasına) izin veren bir özelliğe sahiptir . Bu durumda, AppDomain.UnhandledException olayı oluşturulmaz.

Application.ThreadExceptionyakalanabilir ve uygulama devam edebilir (genel olarak harika bir fikir değildir, ancak bazı eylemleri periyodik olarak çalıştırmak gibi uygulama için bu iyi bir çözümdür).

Windows Forms tarafından oluşturulmayan ve sahip olunmayan iş parçacıklarında oluşan özel durumları yakalamak için AppDomain.UnhandledException. Sistem varsayılan işleyicisi istisnayı kullanıcıya bildirmeden ve uygulamayı sonlandırmadan önce uygulamanın istisna hakkındaki bilgileri günlüğe kaydetmesine izin verir.
Bu istisnanın işlenmesi, uygulamanın sonlandırılmasını engellemez.
Yapılabilecek maksimum değer (istisnalar ele alınmadığında program verileri bozulabilir) daha sonra kurtarma için program verilerini kaydetmektir. Bundan sonra uygulama etki alanı kaldırılır ve uygulama sona erer.

.NET 4'ten başlayarak , olay işleyicisi güvenlik açısından kritik olmadığı ve HandleProcessCorruptedStateExceptionsAttribute özniteliğe sahip olmadığı sürece, bu olay, yığın taşmaları veya erişim ihlalleri gibi işlemin durumunu bozan istisnalar için başlatılmaz .

Daha fazla ayrıntı için, bkz. MSDN .


18

Tamam - Önümde tuttum, msdn'den gelen bu kod parçası oldukça açıklayıcı:

public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new 
        ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms 
    // errors to go through our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}

3
bu, serhio'nun diğer cevabının tersidir: UnhandledExceptionMode.ThrowException, ThreadException olay işleyicisi bağlanmadan önce ayarlanmalıdır. Siparişin gerçekten önemli olup olmadığından emin değilim ...
Davide Piras

@DavidePiras evet ve daha karanlık bir şeyler var. SetUnhandledException benim durumumda bir fark yaratmıyor gibi görünüyor.
nawfal

0

Mesele şu ki, ThreadExceptioniş parçacığınızdaki bir sorun nedeniyle ortaya çıkıyor, Unhandled Exceptionkod işlenmeyen bir istisna atarsa ​​ateşleniyor.

İkincisine neden olmanın kolay yolu, denemesiz bir uygulama oluşturmaktır ... blokları yakalamak ve bir istisna atmak.

Şimdi, sigortaya ihtiyacınız varsa ikisini de halledebilirsiniz, ancak eğer exceptionsdoğru şekilde yakalar ve idare ederseniz, o zaman UnhandledExceptionişleyiciye ihtiyacınız olmaz , çünkü bir tür hepsini yakalamak gibi.


teşekkürler - hakkında çok net olmadığım şey, UnhandledException'ı ele alırsam, ThreadException'ı da yakalayacağımdı - ki durum böyle değil
JohnIdol
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.