본문 바로가기
프로그래밍 속 지혜/WPF

WPF - Application의 DispatcherUnhandledException를 이용한 모든 Exception 처리

by 생속지 2021. 2. 25.
반응형

WPF - Application의 DispatcherUnhandledException를 이용한 모든 Exception 처리

애플리케이션 개발 시 런타임에 발생하는 Exception으로 애플리케이션이 강제 종료되는 현상이 발생하곤 합니다.
try catch로 일일이 처리 할 수도 있으나 작업량이 너무 많습니다.
Application의 DispatcherUnhandledException 이벤트를 활용하여 모든 Exception에 대해서 메세지창으로 사용자에게 보여주고, 로그를 저장하여 유지보수에 유용하게 활용하면 좋을 듯합니다.

 

1. App.xml에 DispatcherUnhandledException 이벤트를 추가합니다.
 (1) App.xaml을 엽니다.

 (2) App.xaml의 DispatcherUnhandledException 이벤트를 추가합니다.

<Application x:Class="WpfDispatcherUnhandledException.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfDispatcherUnhandledException"
             StartupUri="MainWindow.xaml"
             DispatcherUnhandledException="Application_DispatcherUnhandledException">
    <Application.Resources>
         
    </Application.Resources>
</Application>

 

2. App.xaml.cs의 Application_DispatcherUnhandledException 메소드에 Exception을 처리합니다.

 - App.xaml에 DispatcherUnhandledException 이벤트를 추가하면 App.xaml.cs에 Application_DispatcherUnhandledException가 추가됩니다.

 - DispatcherUnhandledExceptionEventArgs의 Handled에 true로 설정해야 더이상 Exception을 처리하지 않습니다.

using System.Windows;

namespace WpfDispatcherUnhandledException
{
    /// <summary>
    /// App.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class App : Application
    {
        private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            MessageBox.Show(e.Exception.Message);

            e.Handled = true;
        }
    }
}

 

3. Main Window에 버튼을 추가하여 강제로 Exception을 발생시킵니다.
 (1) Main Winndow XAML에 버튼을 추가합니다.

 (2) 버튼에 클릭 이벤트를 추가 후 강제로 Exception을 발생시킵니다.

using System;
using System.Windows;

namespace WpfDispatcherUnhandledException
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            throw new Exception("오류 발생");
        }
    }
}

 

소스가 간단하니 테스트 해보세요~~

반응형

댓글