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



我的视图<Button Content="Search" cal:Message.Attach="SearchAsync"/>中有一个按钮,它调用了一个函数,这引发了一个异常。我正在尝试在我的引导程序类中捕获此异常

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 应该用于操作,因为它们是事件处理程序(源)。

我想出的解决方案是:要么使用命令,要么将任务函数包装在 try/catch 中,我都不太满意。

在 Caliburn.Micro 中使用 async 和 await 并仍然使用 cal:Message.Attach="xyz" 语法的正确方法是什么?

最好我想在没有其他任何东西的情况下使用异步任务语法,因为它提供了最好的测试能力并且需要最少的代码量。

在 Caliburn.Micro 中使用 async 和 await 并仍然使用 cal:Message.Attach="xyz" 语法的正确方法是什么?

您应该在xyz中捕获异常:

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

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

相关内容

  • 没有找到相关文章

最新更新