Aż do teraz, po prostu umieścić blok try / catch wokół Application.Run
w Program.cs
punkcie wejścia do programu. To wychwytuje wszystkie wyjątki wystarczająco dobrze w trybie debugowania, ale kiedy uruchamiam program bez trybu debugowania, wyjątki nie są już obsługiwane. Otrzymuję nieobsługiwane pole wyjątków.
Nie chcę, żeby to się stało. Chcę, aby wszystkie wyjątki były przechwytywane podczas uruchamiania w trybie bez debugowania. Program ma wiele wątków i najlepiej, aby wszystkie wyjątki od nich były przechwytywane przez tę samą procedurę obsługi; Chcę rejestrować wyjątki w bazie danych. Czy ktoś ma jakieś rady jak to zrobić?
źródło
W NET 4 niektóre wyjątki nie są już domyślnie przechwytywane; są to zazwyczaj wyjątki wskazujące na (prawdopodobnie krytyczny) uszkodzony stan pliku wykonywalnego, na przykład wyjątek AccessViolationException.
Spróbuj użyć tagu [HandleProcessCorruptedStateExceptions] przed główną metodą, np.
using System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions [HandleProcessCorruptedStateExceptions] public static int Main() { try { // Catch any exceptions leaking out of the program CallMainProgramLoop(); } catch (Exception e) // We could be catching anything here { System.Console.WriteLine(e.Message); return 1; } return 0; }
źródło
AppDomain.CurrentDomain.UnhandledException
iApplication.ThreadException
też z[HandleProcessCorruptedStateExceptions]
tagiem?Ładny przykład można znaleźć pod adresem http://www.csharp-examples.net/catching-unhandled-exceptions/ Zasadniczo zmień swój główny na:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.Run(new Form1()); } static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception"); } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception"); }
źródło
Możesz do tego użyć biblioteki NBug . Przy minimalnej konfiguracji, takiej jak ta:
NBug.Settings.Destination1 = "Type=Mail;[email protected];[email protected];SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException;
Możesz zacząć zbierać informacje o wszystkich nieobsłużonych błędach w aplikacji, nawet jeśli jest ona wdrożona na klientach. Jeśli nie chcesz korzystać z biblioteki innej firmy, dołącz do poniższych wydarzeń:
// These two should come before enabling visual styles or running the application AppDomain.CurrentDomain.UnhandledException += ... Application.ThreadException += ... ... Application.Run(new Form1());
źródło
Check Online for a Solution
lubClose the Program
... itd. Ale jeśli NIE subskrybuję, otrzymuję zwykły ogólny nieobsługiwany wyjątek .NET Okno. Dzieje się tak w przypadku kompilacji wydania i debugowania, próbowano również ustawićApplication.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
nic nie zmienia.