読者です 読者をやめる 読者になる 読者になる

しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

UnobservedTaskException で未処理の例外を catch ・・・できなかった;

WinRT では UnobservedTaskException という未処理の例外を catch できるのではないかと思われるイベントがあります

イベントハンドラなど async void となるメソッド内で発生した例外は UnhandledException のイベントで catch できないですが、これなら catch できるのか?!と思い試してみました

/// <summary>
/// アプリケーション起動処理
/// </summary>
/// <param name="args"><see cref="LaunchActivatedEventArgs"/> の起動イベント引数</param>
/// <returns>Task</returns>
protected override Task OnLaunchApplication(LaunchActivatedEventArgs args)
{
    TaskScheduler.UnobservedTaskException += this.OnOccuredUnobservedTaskException;
    NavigationService.Navigate("Top", null);
    return Task.FromResult<object>(null);
}

/// <summary>
/// 監視されない例外発生イベントハンドラ
/// </summary>
/// <param name="sender">イベント発行者</param>
/// <param name="e">イベント引数</param>
private void OnOccuredUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    Debug.WriteLine(e.Exception.ToString());
    e.SetObserved();
}

catch はこんな感じに仕掛けるみたいです

あとはイベントハンドラで無理やり例外を発生させてみると

/// <summary>
/// ボタンクリックイベントハンドラ
/// </summary>
/// <param name="sender">イベント発行者</param>
/// <param name="e">イベント引数</param>
private async void OnButtonCliced(object sender, RoutedEventArgs e)
{
    throw new ArgumentException("これはテストです");
}

・・・catch できませんでした; やっぱり糖衣構文とかを使って地道にメソッド内 try catch するしかないんでしょうか;