如何使用Caliburn.Micro处理异步代码中的异常

时间:2019-06-16 00:26:40

标签: c# wpf async-await caliburn.micro

我的视图<Button Content="Search" cal:Message.Attach="SearchAsync"/>中有一个按钮,该按钮调用一个函数,从而引发异常。我正在尝试使用

在我的Bootstrapper类中捕获此异常
protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;
    e.Exception.Log();
}
  • 如果函数看起来像这样:public async Task SearchAsync(),则错误只会被吞没,并且永远不会达到OnUnhandledException,
  • 如果函数看起来像这样:public async void SearchAsync()会引发异常,但调试器将停止并等待我在void函数中按继续,并且我需要为每个Task函数创建一个void函数,并且
  • 如果我使用AsyncReactiveCommand,则可以捕获OnUnhandledException中的异常,但再次使用命令会产生额外的代码(SearchCommand = new AsyncReactiveCommand().WithSubscribe(async () => await SearchAsync());)。

据我所知,应该将异步void用于操作,因为它们是事件处理程序(source)

我想出的解决方案是:使用Command或将Task函数包装在try / catch中,我都不满意。

在Caliburn.Micro中使用异步和等待并仍使用cal:Message.Attach =“ xyz”语法的正确方法是什么?

优选地,我想不使用其他任何东西而使用异步任务语法,因为它提供了最佳的测试能力并且需要最少的代码。

1 个答案:

答案 0 :(得分:0)

  

在Caliburn.Micro中使用异步和等待并仍使用cal:Message.Attach =“ xyz”语法的正确方法是什么?

您应该在xyz中捕获异常:

public async Task xyz()
{
    try
    {
        //...
    }
    catch (Exception ex)
    {
        //handle...
    }
}

如果要在引导程序的OnUnhandledException中全局处理它,则应将返回类型从Task更改为void。返回Task的方法被视为协程。