[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

MSDN WPF 샘플 따라하기 - UnhandledExceptionHandling

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:    }  

댓글

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행