2008-12-24 43 views
9

Tôi đã bắt đầu một dự án WPF mới trong VS2008 và sau đó thêm một số mã vào bẫy DispatcherUnhandledException. Sau đó, tôi thêm một ngoại lệ ném vào Window1 nhưng lỗi không bị xử lý bởi bẫy. Tại sao?WPF - DispatcherUnhandledException dường như không hoạt động

public App() 
    { 
     this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); 

    } 

    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     System.Windows.MessageBox.Show(string.Format("An error occured: {0}", e.Exception.Message), "Error"); 
     e.Handled = true; 
    } 

void Window1_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

Trả lời

5

Điều này có thể xảy ra do cách bạn gỡ rối xử lý ngoại lệ - Gỡ lỗi/Ngoại lệ ... sẽ cho phép bạn định cấu hình chính xác cách bạn muốn xử lý.

1

Đối với những người quan tâm

Dường như IDE vẫn vi phạm về ngoại lệ và rằng nếu bạn nhấp vào tiếp tục trong IDE nó gọi xử lý lỗi.

2

Lúc đầu, ngay cả bên ngoài môi trường gỡ lỗi, trình xử lý của tôi dường như không kích hoạt ..... sau đó tôi nhận ra rằng tôi quên đặt e.Handled = true.

Sự thật là nó hoạt động nhưng vì e.Handled vẫn sai nên trình xử lý ngoại lệ chuẩn vẫn khởi động và thực hiện điều đó.

Sau khi tôi đặt e.Handled = true, thì mọi thứ đều trở nên điên cuồng. Vì vậy, nếu nó không làm việc cho bạn, hãy chắc chắn rằng bạn đã thực hiện bước đó.

3

Nhìn vào sau MSDN liên kết http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx Tiếp theo là có liên quan ở đây

Nếu một ngoại lệ không được xử lý trên hoặc là một giao diện người dùng nền (UI) chủ đề (a thread với Dispatcher riêng của mình) hoặc một nền sợi nhân (một mà không có Bộ điều phối), ngoại lệ không được chuyển tiếp đến luồng giao diện người dùng chính. Do đó, DispatcherUnhandledException không được nâng lên. Trong những trường hợp này, bạn cần phải viết mã để thực hiện các việc sau:

  1. Xử lý ngoại lệ trên chuỗi nền.
  2. Gửi các ngoại lệ đó cho chuỗi giao diện người dùng chính.
  3. Làm lại chúng trên chuỗi giao diện người dùng chính mà không cần xử lý chúng để cho phép DispatcherUnhandledException được nâng lên.
+4

Ngoại trừ mã trong danh sách sẽ ném ngoại lệ lên chuỗi giao diện người dùng chính. – svick

+0

bị hạ cấp ... vì trong ví dụ ngoại lệ được ném vào chuỗi chính –

0

Đây là cách tôi xử lý. Điều này không phải là đẹp nhưng hãy nhớ rằng loại lỗi này sẽ không bao giờ làm cho nó qua gỡ lỗi như một dev. Những lỗi đó phải được giải quyết lâu trước khi bạn đi vào sản xuất (do đó, nó không sao mà điều này là không đẹp). Trong dự án Startup, trong mã App.xaml (App.xaml.cs) phía sau, tôi đặt đoạn mã sau đây.

  • OnStartup, tạo một DispatcherUnhandledException xử lý sự kiện
  • Trong xử lý, sử dụng một MessageBox để hiển thị tin nhắn. Lưu ý rằng khả năng cửa sổ khởi động của nó chưa được tạo nên không cố gắng đặt nó trong cửa sổ.
  • e.Xử lý lỗi
  • Tôi muốn biết khi nào có lỗi nội bộ bổ sung nên tôi tiếp tục gọi cửa sổ hiển thị cho đến khi lỗi nội bộ rỗng.

Tôi không chắc chắn lý do tại sao mã khối ký tự đặc biệt không định dạng chính xác. Xin lỗi vì điều đó.

protected override void OnStartup(StartupEventArgs e) 
    { 
     // define application exception handler 
     Application.Current.DispatcherUnhandledException += 
      AppDispatcherUnhandledException; 

     // defer other startup processing to base class 
     base.OnStartup(e); 
    } 

    private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     runException(e.Exception); 

     e.Handled = true; 
    } 

    void runException(Exception ex) 
    { 
     MessageBox.Show(
      String.Format(
       "{0} Error: {1}\r\n\r\n{2}", 
       ex.Source, ex.Message, ex.StackTrace, 
       "Initialize Error", 
       MessageBoxButton.OK, 
       MessageBoxImage.Error)); 

     if (ex.InnerException != null) 
     { 
      runException(ex.InnerException); 
     } 
    } 
Các vấn đề liên quan