2013-05-23 4 views
8

Я пишу небольшую библиотеку, которая ловит все необработанные исключения, показывает небольшой диалог (похожий на обычный диалог NF), который дает пользователю возможность отправить исключение разработчику. Для этого я использую UnhandledException-событие в AppDomain, как это:UnhandledException Событие не работает?

app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) => 
     { 
      ExceptionHandler handler = new ExceptionHandler((Exception)e.ExceptionObject, ExEntry); 
      UnhandledExceptionListened(handler); 
      if (Properties.Settings.Default.ShowStandardExceptionDialog) 
      { 
       ExceptionDialog exdialog = new ExceptionDialog(handler); 
       exdialog.ShowDialog(); 
      } 
     }; 

ExceptionHandler и ExEntry классы моей библиотеки. Но: Если возникает исключение, компилятор переходит в мое Лямбда-выражение, пытается отладить первую строку кода, а затем показывает ошибку, которая произошла до этого, без отработки остальной лямбда. Но если я просто пишу:

app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) => 
     { 
       ExceptionDialog exdialog = new ExceptionDialog(handler); 
       exdialog.ShowDialog(); 
     }; 

она прекрасно работает. У кого-нибудь есть идея, почему это не работает?

+1

Оберните свой верхний код в попытке поймать и поместите точку наблюдения в ловушку. Есть ли исключение, и если да, то что это? – TheKingDave

+0

Как насчет простого тестирования создания вашего обработчика исключений в тестовом блоке? что происходит, чем? –

ответ

3

Возможны две причины.

Возможным является то, что вы не установите UnhandledExceptionMode правильно:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

Еще может быть, что вы не справиться с ThreadException, и выброшенное исключение не было необработанное исключение, а исключение нить.

Ниже приведен пример, вам необходимо изменить его в соответствии со сценарием:

Application.ThreadException+= 
    new ThreadExceptionEventHandler(Log.WriteThreadException); 

AppDomain.CurrentDomain.UnhandledException+= 
    new UnhandledExceptionEventHandler(Log.WriteUnhandledException); 

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
Application.Run(new Form1()); 
1

По моему опыту, это не работает:

public partial class Form1 : Form 
    { 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1Load(object sender, EventArgs e) 
    { 
     Application.ThreadException += ApplicationThreadException; 
     Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 
    } 

    void ApplicationThreadException(object sender, ThreadExceptionEventArgs e) 
    { 
     //throw new NotImplementedException(); 
    } 

    void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     //throw new NotImplementedException(); 
    } 
    } 

Но это делает:

[STAThread] 
static void Main() 
{ 

    Application.ThreadException += ApplicationThreadException; 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    //throw new NotImplementedException(); 
} 

static void ApplicationThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    //throw new NotImplementedException(); 
} 

Возможно, необходимо установить глобальный обработчик перед Application.Run()

Смежные вопросы