Unhandled ngoại lệ hành vi trong một 1.x NET ứng dụng Windows Forms phụ thuộc vào:
- Các loại chủ đề mà ném ngoại lệ
- Cho dù đó xảy ra trong khi xử lý thông điệp cửa sổ
- Cho dù một debugger đã được đính kèm vào quá trình
- Cài đặt đăng ký DbgJitDebugLaunchSetting
- Cờ jitDebugging trong App.Config
- Cho dù bạn overrode Windows Forms ngoại lệ handler
- Cho dù bạn xử lý sự kiện ngoại lệ của CLR
- Giai đoạn của mặt trăng
Hành vi mặc định của ngoại lệ unhandled là:
- Nếu ngoại lệ xảy ra trên chủ đề chính khi bơm thông điệp cửa sổ, nó bị chặn bởi trình xử lý ngoại lệ của Windows Forms.
- Nếu ngoại lệ xảy ra trên luồng chính khi bơm thông báo cửa sổ, nó sẽ chấm dứt quá trình ứng dụng trừ khi nó bị chặn bởi trình xử lý ngoại lệ Windows Forms.
- Nếu ngoại lệ xảy ra trên một hướng dẫn sử dụng, threadpool, hoặc thread finalizer, nó bị nuốt chửng bởi CLR.
Các điểm tiếp xúc cho một ngoại lệ unhandled là:
- Windows Forms xử lý ngoại lệ.
- Công tắc đăng ký gỡ lỗi JIT DbgJitDebugLaunchSetting.
- Sự kiện ngoại lệ CLR không được xử lý.
Windows Form built-in xử lý ngoại lệ nào sau đây theo mặc định:
- Catches một ngoại lệ unhandled khi:
- ngoại lệ là trên thread chính và không debugger đính kèm.
- ngoại lệ xảy ra trong quá trình xử lý tin nhắn cửa sổ.
- jitDebugging = false trong App.Config.
- Hiển thị hộp thoại cho người dùng và ngăn chặn việc chấm dứt ứng dụng.
Bạn có thể tắt hành vi sau bằng cách đặt jitDebugging = true trong App.Config. Nhưng hãy nhớ rằng đây có thể là cơ hội cuối cùng của bạn để ngừng chấm dứt ứng dụng. Vì vậy, bước tiếp theo để bắt một lỗi nào đó được đăng ký cho sự kiện Application.ThreadException, ví dụ .:
Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);
Lưu ý các thiết lập DbgJitDebugLaunchSetting dưới HKEY_LOCAL_MACHINE \ Software.NetFramework registry. Điều này có một trong ba giá trị mà tôi biết:
- 0: hiển thị hộp thoại người dùng yêu cầu "gỡ lỗi hoặc chấm dứt".
- 1: cho phép ngoại lệ thông qua để CLR xử lý.
- 2: khởi chạy trình gỡ lỗi được chỉ định trong khóa đăng ký DbgManagedDebugger.
Trong Visual Studio, bạn vào menu cụ → Tùy chọn → Debugging → JIT để thiết lập phím này để 0 hoặc 2. Nhưng giá trị là 1 thường tốt nhất là trên một người dùng cuối của máy móc. Lưu ý rằng khoá đăng ký này được thực hiện trước sự kiện ngoại lệ CLR chưa được xử lý.
Sự kiện cuối cùng này là cơ hội cuối cùng để bạn đăng nhập ngoại lệ chưa được xử lý. Nó được kích hoạt trước khi các khối Cuối cùng của bạn đã thực thi. Bạn có thể chặn sự kiện này như sau:
AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);