ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Windowsストアアプリの未処理例外を捕捉する

Windows 8 では、ストアアプリで処理されなかった例外を UnhandledException イベントで捕捉できませんでした。予期せぬ例外が発生すると、ストアアプリがストンと落ちてしまうアレです。Silverlight のときは、非同期処理の中で発生した例外であっても、UnhandledException イベントで捕捉できていたので困っていましたが、Windows 8.1 から改善され、async/await に対応しました。

さらに、C++などのアンマネージコードで発生した例外を捕捉できる API も追加されています。

CoreApplication.UnhandledErrorDetectedイベント

Build 2013 のセッションでも、紹介されています。(スライドの22ページ)

channel9.msdn.com

新たに追加された UnhandledErrorDetected イベントを使うことで、非同期処理(async / await)の中で発生した例外も捕捉できます。

#App.xaml.cs
public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;
    CoreApplication.UnhandledErrorDetected += CoreApplication_UnhandledErrorDetected;
}
 
private async void CoreApplication_UnhandledErrorDetected(object sender, UnhandledErrorDetectedEventArgs e)
{
    var message = "";
 
    try
    {
        e.UnhandledError.Propagate();
    }
    catch (Exception ex)
    {
        message = ex.Message;
    }
    await new MessageDialog(message, "エラーメッセージ").ShowAsync();
}

今さら感のある内容ですが、アプリを作る上で例外管理は重要なので、地味に嬉しかった Windows 8.1 での改善でした。