Thông thường tôi sử dụng một cái gì đó như thế này để thử và nắm bắt tất cả các ngoại lệ cấp cao bất ngờ.
using System;
static class Program
{
[STAThread]
static void Main(string[] argv)
{
try
{
AppDomain.CurrentDomain.UnhandledException += (sender,e)
=> FatalExceptionObject(e.ExceptionObject);
Application.ThreadException += (sender,e)
=> FatalExceptionHandler.Handle(e.Exception);
// whatever you need/want here
Application.Run(new MainWindow());
}
catch (Exception huh)
{
FatalExceptionHandler.Handle(huh);
}
}
static void FatalExceptionObject(object exceptionObject) {
var huh = exceptionObject as Exception;
if (huh == null) {
huh = new NotSupportedException(
"Unhandled exception doesn't derive from System.Exception: "
+ exceptionObject.ToString()
);
}
FatalExceptionHandler.Handle(huh);
}
}
Có thể đây cũng là điều bạn thấy hữu ích? Mã chính này định tuyến tất cả ba cách bắt các ngoại lệ cấp cao bất ngờ thông qua một cuộc gọi phương thức. Tất cả những gì bạn cần bây giờ là một lớp tĩnh FatalExceptionHandler
bao gồm xử lý ngoại lệ cấp cao nhất trong phương thức Handle
của nó.
Và thực sự, bất kỳ nhà phát triển ứng dụng biết có thực sự chỉ là hai điều cần làm đó:
- Hiện/log ngoại trừ như bạn thấy phù hợp
- Hãy chắc chắn rằng bạn quá trình thoát/diệt các ứng dụng
Nếu bạn cho rằng mục thứ hai là lạ, hãy nhớ rằng chúng tôi chỉ bận tâm thực hiện điều này ngay từ đầu cho các tình huống thực sự đặc biệt. Những điều này có thể là lỗi cần thay đổi đối với ứng dụng của bạn để được giải quyết chính xác. Bất kỳ xử lý ngoại lệ nào khác - loại chức năng - phải thấp hơn bên trong mã chương trình thực tế của bạn, bắt các loại ngoại lệ cụ thể, điều này có ý nghĩa và xử lý chúng theo cách có ý nghĩa. Bất cứ điều gì khác nên bong bóng lên đến FatalExceptionHandler
của bạn để làm cho bản thân biết và ngăn chặn các chương trình có thể làm tê liệt từ làm việc kể từ trạng thái hỏng
chương trình Chết nói không dối trá ... ;-)
tốt, vâng, tất nhiên tôi biết điều đó;) – agnieszka
thì tại sao không bắt chúng trong Main()? –
"tôi biết rằng" là một câu trả lời cho phần "chìm cho lỗi". tôi đã được dạy thử nắm bắt trong chính là một điều bạn không nên làm. Tuy nhiên, tôi phải nói một cách trung thực rằng tôi không biết tại sao nó sẽ là một cách tiếp cận xấu (tất nhiên nếu tôi bắt tất cả các trường hợp ngoại lệ tôi có thể nghĩ bên trong mã) – agnieszka