, 나는 일반적으로이 메시지 상자를 방지하기 위해 여러 단계를 수행.
우선, 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
이없는 경우 호출되는 이벤트 핸들러를 구독하십시오.
개인적으로 최대한 적은 수의 블록을 사용하려고합니다 (이상적으로는 아무 것도 없음).