Yanıtlar:
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.
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 durumdaUnhandledException
olay gündeme getirilmez. Bu davranış, uygulama yapılandırma dosyası kullanılarak veya olay işleyicisi bağlanmadan önceApplication.SetUnhandledExceptionMode
modu 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.ThrowException
ThreadException
UnhandledException
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,ExitApplication
uygulamanı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.ThreadException
yakalanabilir 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 .
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());
}
Mesele şu ki, ThreadException
iş parçacığınızdaki bir sorun nedeniyle ortaya çıkıyor, Unhandled Exception
kod 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 exceptions
doğru şekilde yakalar ve idare ederseniz, o zaman UnhandledException
işleyiciye ihtiyacınız olmaz , çünkü bir tür hepsini yakalamak gibi.
Application.ThreadException
. Bunun için [burada ] küçük C # kodumla bir soru sordum .