【问题标题】:How to handle exceptions in async code with Caliburn.Micro如何使用 Caliburn.Micro 处理异步代码中的异常
【发布时间】:2019-10-30 02:16:30
【问题描述】:

我的视图<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 函数中按 continue,我需要为每个 Task 函数创建一个 void 函数,并且
  • 如果我使用AsyncReactiveCommand,它能够在 OnUnhandledException 中捕获异常,但再次使用命令会产生额外代码 (SearchCommand = new AsyncReactiveCommand().WithSubscribe(async () => await SearchAsync());)。

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

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

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

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

【问题讨论】:

  • 它抛出一个未处理的异常并且 UI 崩溃。 你确定它不只是中断,如果你有一个调试器,这是标准行为,参考 this评论。继续执行(按 F5)应该会让你通过。
  • 你说得对,我忽略了我可以继续,但这对我来说仍然不合适。我编辑了问题。
  • 这可能是因为它不是为了感觉正确。例外适用于例外情况,它们不应用于常规程序流程。
  • 你是对的,但我仍然想在某个时候以最方便的方式捕获每个异常。换句话说,我想使用异步任务,而不是为我的 UI 调用函数编写包装器方法。

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


【解决方案1】:

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

您应该在xyz 中捕获异常:

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

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

【讨论】:

  • 有没有办法捕捉协程中处理的任务抛出的每个异常?
猜你喜欢
  • 1970-01-01
  • 2018-10-03
  • 2016-11-10
  • 2011-09-11
  • 2019-08-29
  • 2011-11-11
  • 2012-05-10
  • 1970-01-01
  • 2012-12-27
相关资源
最近更新 更多