UnhandledExceptionHandling
이 샘플은 처리되지 않은 응용 프로그램 예외를 처리하기 위해 DispatcherUnhandledException을 처리하는 방법을 보여줍니다.
두 가지 시나리오:
복구 가능 및 복구 불가 예외를 발생 시키는 이벤트를 가지는 버튼을 생성 합니다.
1: <Window x:Class="UnhandledExceptionHandling.MainWindow"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6: xmlns:local="clr-namespace:UnhandledExceptionHandling"
7: mc:Ignorable="d"
8: Title="MainWindow" Height="350" Width="525">
9: <StackPanel>
10: <Button Name="raiseRecoverableException" Click="raiseRecoverableException_Click">Raise Recoverable Exception</Button>
11: <Button Name="raiseUnrecoverableException" Click="raiseUnrecoverableException_Click">Raise Unrecoverable Exception</Button>
12: </StackPanel>
13: </Window>
1: private void raiseRecoverableException_Click(object sender, RoutedEventArgs e)
2: {
3:
4: throw new DivideByZeroException("Recoverable Exception");
5: }
6: private void raiseUnrecoverableException_Click(object sender, RoutedEventArgs e)
7: {
8:
9: throw new ArgumentNullException(@"Unrecoverable Exception");
10: }
응용프로그램 예외 처리
App 클래스에 DispatcherUnhandledException 이벤트를 추가해 처리되지 않은 이벤트를 수신하도록 합니다.
1: <Application x:Class="UnhandledExceptionHandling.App"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:local="clr-namespace:UnhandledExceptionHandling"
5: StartupUri="MainWindow.xaml" DispatcherUnhandledException="Application_DispatcherUnhandledException">
6: <Application.Resources>
7: </Application.Resources>
8: </Application>
DivideByZeroException 예외가 발생하면 처리되지 않은 예외를 통해 응용프로그램이 종료되지 않게 DispatcherUnhandledException 이벤트를 수신 했다고 명시적으로 알려 줘야 합니다.
ArgumentNullException 예외가 발생하면 사용자에게 데이터를 저장 할 것인지 물어본 후 다음 작업을 진행하고 응용프로그램을 종료 하면 됩니다.
1: public partial class App : Application
2: {
3: private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
4: {
5: // 처리되지 않은 예외 처리
6: var shutdown = false;
7: // 예외 처리
8: if (e.Exception is DivideByZeroException)
9: {
10: // 복구 가능 - 처리 진행
11: shutdown = false;
12: }
13: else if (e.Exception is ArgumentNullException)
14: {
15: // 복구 불가 - 처리 종료
16: shutdown = true;
17: }
18: if (shutdown)
19: {
20: // 복구 할 수없는 경우 데이터 저장을 시도하십시오.
21: var result = MessageBox.Show("Application must exit:\n\n" + e.Exception.Message + "\n\nSave befor exit?", "app", MessageBoxButton.YesNo, MessageBoxImage.Error);
22: if (result == MessageBoxResult.Yes)
23: {
24: // 데이터 저장
25: }
26: // 이벤트 로그에 항목 추가
27: EventLog.WriteEntry("application", "Unrecoverable Exception: " + e.Exception.Message, EventLogEntryType.Error);
28: // 종료 코드 반환
29: Shutdown(-1);
30: }
31: // 처리되지 않은 기본 예외 처리를 방지합니다.
32: e.Handled = true;
33: }
34: }
댓글
댓글 쓰기