2013-06-04 5 views
1

내 WinForms 앱이 처리되지 않은 모든 예외를 처리하기 위해 Application.ThreadException 이벤트 처리기를 설치합니다. 처리기가 대화 상자를 표시합니다 (오류 발생, 버그 보고서 보내기 등).Application.ThreadException이 호출되지 않았습니다.

문제는 응용 프로그램이 모달 대화 상자를 표시 할 때 내 이벤트 핸들러가 호출되지 않는다는 것입니다. MessageBox 또는 예외 대화 상자를 표시하면 모든 예외가 자동으로 삼킨 것입니다. 그들을 붙잡을 방법이 있습니까?

다음은이 동작을 시뮬레이트하는 샘플 WinForms 응용 프로그램입니다. 이 응용 프로그램은 메시지 박스가 표시되면, 백그라운드에서 발생하는 모든 예외는 (ThreadException 핸들러가 호출되지 않습니다) 손실 :

using System; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

class Program 
{ 
    static void Main() 
    { 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

    var form = new MyForm(); 
    Application.ThreadException += (s, e) => 
    { 
     form.AppendText("ThreadException event handler is called."); 
     MessageBox.Show("Error: " + e.Exception); 
    }; 

    Application.EnableVisualStyles(); 
    Application.Run(form); 
    } 
} 

class MyForm : Form 
{ 
    public MyForm() 
    { 
    Controls.Add(TextBox = new TextBox 
    { 
     Multiline = true, 
     Dock = DockStyle.Fill 
    }); 

    ThrowUnhandledException(1); 
    ThrowUnhandledException(2); 
    ThrowUnhandledException(3); 
    } 

    private async void ThrowUnhandledException(int delaySeconds) 
    { 
    await Task.Delay(TimeSpan.FromSeconds(delaySeconds)); 
    AppendText("Throwing a NotImplementedException!"); 
    throw new NotImplementedException(); 
    } 

    private TextBox TextBox { get; set; } 

    public void AppendText(string message) 
    { 
    TextBox.AppendText(message + Environment.NewLine); 
    } 
} 

편집을. 더 명확하게하기 위해 코드를 업데이트했습니다.

예외가 throw되면 MyForm은 TextBox에 다음과 같은 메시지를 씁니다. NotImplementedException을 Throw!

ThreadException 핸들러가 호출되면 다음과 같이 쓰여집니다. ThreadException 이벤트 핸들러가 호출되었습니다. 그리고 나서 메시지 상자를 보여줍니다. 모든 예외가 잡힌 경우

, 내 텍스트 상자는 다음 보여줄 것이다 :

Throwing a NotImplementedException! 
ThreadException event handler is called. 
Throwing a NotImplementedException! 
ThreadException event handler is called. 
Throwing a NotImplementedException! 
ThreadException event handler is called.

하지만 보여줍니다

Throwing a NotImplementedException! 
ThreadException event handler is called. 
Throwing a NotImplementedException! 
Throwing a NotImplementedException!

답변

2

당신은

Application.ThreadException += (s, e) => Console.WriteLine(e.Exception); 

Application.ThreadException += (s, e) => MessageBox.Show("Error: " + e.Exception); 

를 교체 시도 할 수 있습니다 당신은 이벤트 핸들러마다 호출되는 않는 것을 볼 수 있습니다.

+0

예, 그게 핵심입니다. ** MessageBox가 표시되면 ** 이벤트 핸들러가 호출되지 않습니다. 콘솔에 쓰고 핸들러에 메시지 상자를 표시하십시오. – yallie

+0

@yallie 귀하의 요지를 봅니다. 'await ThrowUnhandledException (' – clearpath

+0

)와 같이'await's를 사용하여 비동기 호출을 직렬화 해보십시오.이 코드 부분은 시뮬레이션에 불과합니다. 실제 응용 프로그램 이벤트는 비동기 적으로 발생합니다.비동기 서버 호출은 예외를 throw합니다. – yallie

0

내가 프로그램을 시도했지만이에 대한 잘 작동하는 것 같다 나를. ThrowUnhandledException은 3 번 호출됩니다. 세 개의 메시지가 모두 TextBox에 추가됩니다.

나는 MessageBox에 추가하는 시도 :

ThrowUnhandledException(1); 
ThrowUnhandledException(2); 
ThrowUnhandledException(3); 

MessageBox.Show("Hello"); 

을하지만 너무 예상대로 작동합니다. 메시지 상자가 있지만 예외 처리기에 중단 점을 넣으면 세 번 호출됩니다. 그리고 메시지 상자를 닫으면 MyForm 창에 세 가지 메시지가 모두 표시됩니다.

+0

맞습니다. 세 개의 메시지가 모두 TextBox에 추가됩니다. ** 그러나 예외가 throw되기 전에 이러한 메시지가 추가됩니다. ** 몇 개의 메시지 상자가 표시 되었습니까? – yallie

+0

업데이트 된 코드 샘플을 사용해보십시오. 그것이 문제를보다 분명하게 보여주기를 바랍니다. – yallie

+0

지금 문제가 있습니다. – shamp00

관련 문제