2011-10-03 7 views
2

우리는 서버 인스턴스에 응용 프로그램을 가지고 있지만 아주 드물게 예외가 있지만 메모리 예외가 있습니다 (프로그램이 누출되지 않습니다. 인스턴스가 아주 작아서 아주 많은 양의 데이터로 작동합니다) .오류 메시지 창을 피하는 방법

해당 서버 인스턴스의 프로세스를 모니터링하고 일부 프로세스가 프로세스 목록에 없으면 경고 전자 메일이 전송되므로 문제가되지 않습니다.

이제 문제는이 함께 :

프로세스 목록에서 사라지는 과정을 방지, 그래서 실패의에 대해 우리가 경고 이메일을하지 않는

enter image description here

. 프로그램이 우리가 잡지 못하는 것에 실패하면 사용자 상호 작용없이 닫을 수 있다는 메시지를 비활성화 할 수 있습니까?

답변

1

, 나는 일반적으로이 메시지 상자를 방지하기 위해 여러 단계를 수행.

우선, I는 Main 함수 여러 핸들러 연결 : 그렇지 않으면 처리되지 않은 예외가 발생할 때

[STAThread] 
private static void Main() 
{ 
    Application.ThreadException += 
     application_ThreadException; 

    Application.SetUnhandledExceptionMode(
     UnhandledExceptionMode.CatchException); 

    AppDomain.CurrentDomain.UnhandledException += 
     currentDomain_UnhandledException; 

    Application.Run(new MainForm()); 
} 

그러한 핸들러가 호출되고있다. 나는 그들에게 뭔가를 정의 할 :

private static void application_ThreadException(
    object sender, 
    ThreadExceptionEventArgs e) 
{ 
    doHandleException(e.Exception); 
} 

private static void currentDomain_UnhandledException(
    object sender, 
    UnhandledExceptionEventArgs e) 
{ 
    doHandleException(e.ExceptionObject as Exception); 
} 

후 실제 오류 처리를 수행 호출되는 실제 doHandleException 기능. 일반적으로 오류를 기록하고 사용자에게 알리고 응용 프로그램을 계속하거나 종료 할 수있는 옵션을 제공합니다.

public static string buildMessage(Exception exception) 
{ 
    var result = new StringBuilder(); 

    while (exception != null) 
    { 
     result.AppendLine(exception.Message); 
     result.AppendLine(); 
     exception = exception.InnerException; 
    } 

    return result.ToString().Trim(); 
} 

당신이 윈도우 폼 그러나 예를 들어,하지를 사용하는 경우 : 도우미 기능으로

private static void doHandleException(
    Exception e) 
{ 
    try 
    { 
     Log.Instance.ErrorException(@"Exception.", e); 
    } 
    catch (Exception x) 
    { 
     Trace.WriteLine(string.Format(
       @"Error during exception logging: '{0}'.", x.Message)); 
    } 

    var form = Form.ActiveForm; 
    if (form == null) 
    { 
     MessageBox.Show(buildMessage(e), 
       "MyApp", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    else 
    { 
     MessageBox.Show(form, buildMessage(e), 
       "MyApp", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

: 같은

실제 응용 프로그램에서 예 보인다 콘솔 응용 프로그램 또는 WPF, 일부 처리기는 존재하지 않지만 나머지는 대신 제공됩니다.

아이디어가 그대로 유지됩니다. 코드 블록 주위에 try...catch이없는 경우 호출되는 이벤트 핸들러를 구독하십시오.

개인적으로 최대한 적은 수의 블록을 사용하려고합니다 (이상적으로는 아무 것도 없음).

2

이 기능을 비활성화 할 수 있는지 여부는 알 수 없지만 그렇게해서는 안됩니다. 응용 프로그램의 버그/문제점을 찾아서 종료하거나 문제를 방지하려면 먼저 문제를 해결하십시오. 그 밖의 모든 것들은 실제 원유 해결책이 될 것이고 귀하의 고객이 그런 행동을하게되어 기쁘지는 않을 것입니다. (결국 데이터가 손실되지 않을 것인가? 그렇지 않다면이 버기/완료되지 않은 터치)

1

프로그램에서 전역 try/catch 블록을 삽입하고 예기치 않은 예외가 발생하면 프로그램을 종료 할 수 있습니다.

1

WPF를 사용하는 경우 app.xaml.cs에서 다음 두 가지 예외를 시도해 볼 수 있습니다. 이 처리 할 수있는 기타/보완 예외가 될 수 있지만 이것은 내가 일반적으로 찾고 있어요 두 가지입니다 수 있습니다

AppDomain.CurrentDomain.UnhandledException - "이 이벤트는 캐치되지 않는 예외 알림을 제공 그것은 응용 프로그램이 이전 예외에 대한 정보를 기록 할 수 있습니다. 시스템 기본 처리기는 예외를 사용자에게보고하고 응용 프로그램을 종료합니다. 응용 프로그램의 상태에 대한 충분한 정보를 사용할 수 있으면 나중에 복구 할 수 있도록 프로그램 데이터를 저장하는 등의 다른 작업을 수행 할 수 있습니다. 예외가 처리되지 않으면 손상됩니다. "

Dispatcher.UnhandledException - "스레드 예외가 발생하고 Invoke 또는 BeginInvoke를 통해 대리인을 실행하는 동안 catch되지 않을 때 발생합니다."

예 : Windows Forms의 가정

public partial class App : Application 
{ 
public App() 
{ 
    this.Dispatcher.UnhandledException += DispatcherUnhandledException; 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException; 
} 

private void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // log and close gracefully 
} 


private new void DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
{ 
    e.Handled = true; 
    // log and close gracefully 
} 
} 
관련 문제