2016-07-12 4 views
0

매우 큰 C# 응용 프로그램에서 작업합니다. 너무 커서 지금 처리 할 수없는 모든 예외를 잡을 수 없습니다.C# UnhandledException 창에서 종료 할 때 응용 프로그램이 종료되지 않습니다.

응용 프로그램에는 "종료 하시겠습니까?" 응용 프로그램의 FormClosing 이벤트에서 팝업 메시지가 나타납니다.

처리되지 않은 예외가 실행되면 사용자가 종료 단추를 클릭하는 경우가 있습니다. 이 호출 Application.Exit() 또는 일부 폼을 믿습니다. 이것은 또한 FormClosing 이벤트와 팝업 창을 트리거합니다. 당신이 팝업창에서 예를 클릭하거나 더 여부를

Sample Unhandled exception dialog box

이 시점에서 그것은 중요하지 않습니다. Application.Exit() 때문에 응답을받은 후에 응용 프로그램이 종료됩니다.

Application.Exit()이 호출되는 것을 막기 위해 어쨌든 존재합니까?

+3

처리를 'UnhandledException' 이벤트를 사용하면 대화 상자 전체를 바꿀 수 있습니다. – SLaks

+0

코드가 무엇입니까? 코딩 스타일을 모른 채 어떻게 대답 할 수 있습니까? – mostafa8026

+1

어떻게하면 기본 오류 처리를 생략하면서 대규모 응용 프로그램을 만들 수 있었습니까? –

답변

1

응용 프로그램이 종료되지 않도록하려면 예외를 처리해야합니다. 예외를 던질 수있는 모든 장소에서 try..catch를 사용하는 것이 합리적입니다 (많은 수는 없어야 함). 그러나, 거기에 대한 글로벌 이벤트가 있습니다. 메인 스레드에서 예외가 처리와 응용 프로그램 도메인 처리되지 않은 예외로 전파되지 않은 경우

후 응용 프로그램이 유효한 상태에 있지이며 terminate에 있습니다. 이 단계에서 마지막으로 희망하는 것은 예외 정보를 기록하고 응용 프로그램이 정상적으로 종료되기 전에 저장할 수있는 것을 저장하는 것입니다.

static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

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

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // we can log info from e.ExceptionObject and check e.IsTerminating 
} 

In the .NET Framework versions 1.0 and 1.1, an unhandled exception that occurs in a thread other than the main application thread is caught by the runtime and therefore does not cause the application to terminate. Thus, it is possible for the UnhandledException event to be raised without the application terminating. Starting with the .NET Framework version 2.0, this backstop for unhandled exceptions in child threads was removed, because the cumulative effect of such silent failures included performance degradation, corrupted data, and lockups, all of which were difficult to debug. For more information, including a list of cases in which the runtime does not terminate, see Exceptions in Managed Threads .

당신은 또한 처리해야 할 수 있습니다 :

당신은 사용자 친화적 인 오류 처리되지 않은 예외를 기록하고 보여주기 위해이 이벤트를 신청해야

Application.ThreadException += Application_ThreadException;