Windows 8 では、ストアアプリで処理されなかった例外を UnhandledException イベントで捕捉できませんでした。予期せぬ例外が発生すると、ストアアプリがストンと落ちてしまうアレです。Silverlight のときは、非同期処理の中で発生した例外であっても、UnhandledException イベントで捕捉できていたので困っていましたが、Windows 8.1 から改善され、async/await に対応しました。
さらに、C++などのアンマネージコードで発生した例外を捕捉できる API も追加されています。
CoreApplication.UnhandledErrorDetectedイベント
Build 2013 のセッションでも、紹介されています。(スライドの22ページ)
新たに追加された 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 での改善でした。