데스크톱 응용 프로그램에서 처리되지 않은 예외가 발생할 때 가장 좋은 방법은 무엇입니까?
고객에게 지원을 요청할 수 있도록 메시지를 표시하려고했습니다. 사용자에게 응용 프로그램을 다시 시작하는 것이 좋지만 강제로 실행하지 않는 것이 좋습니다. ux.stackexchange.com에서 논의 된 것과 유사 -예상치 못한 애플리케이션 오류를 처리하는 가장 좋은 방법은 무엇입니까?
이 프로젝트는 .NET WPF 응용 프로그램이므로 설명 된 제안은 다음과 같습니다 (이는 간단한 예입니다. 사용자가 "세부 정보 표시"를 클릭하고 일부 기능을 제공 할 때까지 예외 세부 정보를 숨기는 것이 좋습니다. 쉽게 오류를보고하십시오) :
public partial class App : Application
{
public App()
{
DispatcherUnhandledException += OnDispatcherUnhandledException;
}
private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
LogError(e.Exception);
MessageBoxResult result = MessageBox.Show(
$"Please help us fix it and contact support@example.com. Exception details: {e.Exception}" +
"We recommend to restart the application. " +
"Do you want to stop the application now? (Warning: Unsaved data gets lost).",
"Unexpected error occured.", MessageBoxButton.YesNo);
// Setting 'Handled' to 'true' will prevent the application from terminating.
e.Handled = result == MessageBoxResult.No;
}
private void LogError(Exception ex)
{
// Log to a log file...
}
}
구현 (ViewModels 명령 또는 외부 이벤트의 이벤트 처리기)에서 특정 외생 적 예외 만 포착하고 다른 모든 예외 (boneheaded 및 unknown 예외)가 위에서 설명한 "마지막 리조트 핸들러"로 버블 링되도록합니다. 본 헤드 및 외인성 예외에 대한 정의는 다음을 참조하십시오. Eric Lippert-Vexing 예외
사용자가 응용 프로그램을 종료해야하는지 결정하도록하는 것이 합리적입니까? 응용 프로그램이 종료되면 일관성이없는 상태가 아니어야합니다 ... 반면에 사용자는 저장하지 않은 데이터를 잃어 버리거나 응용 프로그램을 다시 시작할 때까지 더 이상 시작된 외부 프로세스를 중지 할 수 없습니다.
또는 작성중인 응용 프로그램 유형에 따라 처리되지 않은 예외에 대해 응용 프로그램을 종료해야하는지 여부가 결정입니까? Code Complete, Second Edition에 설명 된 것처럼 "견고성"과 "정확성"간의 절충점 일 뿐입니 까?
우리가 어떤 종류의 응용 분야에 대해 이야기하고 있는지 알려면 :이 응용 프로그램은 주로 화학 실험실 장비를 제어하고 측정 결과를 사용자에게 보여주기 위해 사용됩니다. 그렇게하기 위해 WPF 응용 프로그램은 일부 서비스 (로컬 및 원격 서비스)와 통신합니다. WPF 응용 프로그램은 계측기와 직접 통신하지 않습니다.