如何使用 Caliburn.Micro 处理异步代码中的异常
How to handle exceptions in async code with Caliburn.Micro
我的视图中有一个按钮 <Button Content="Search" cal:Message.Attach="SearchAsync"/>
,它调用一个函数,该函数引发异常。我试图在我的 Bootstrapper class 中用
捕获这个异常
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());
)。
据我所知,async void 应该用于操作,因为它们是事件处理程序 (source)。
我想到的解决方案是:使用命令或将任务函数包装在 try/catch 中,我对这两种方法都不满意。
在 Caliburn.Micro 中使用 async 和 await 并仍然使用 cal:Message.Attach="xyz" 语法的正确方法是什么?
我最好只使用异步任务语法,因为它提供最好的测试能力并且需要最少的代码。
What is the right way to work with async and await in Caliburn.Micro and still use the cal:Message.Attach="xyz" syntax?
您应该在 xyz
中捕获异常:
public async Task xyz()
{
try
{
//...
}
catch (Exception ex)
{
//handle...
}
}
如果你想在引导程序的 OnUnhandledException
中全局处理它,你应该将 return 类型从 Task
更改为 void
。方法 returning Task
被视为协程。
我的视图中有一个按钮 <Button Content="Search" cal:Message.Attach="SearchAsync"/>
,它调用一个函数,该函数引发异常。我试图在我的 Bootstrapper class 中用
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());
)。
据我所知,async void 应该用于操作,因为它们是事件处理程序 (source)。
我想到的解决方案是:使用命令或将任务函数包装在 try/catch 中,我对这两种方法都不满意。
在 Caliburn.Micro 中使用 async 和 await 并仍然使用 cal:Message.Attach="xyz" 语法的正确方法是什么?
我最好只使用异步任务语法,因为它提供最好的测试能力并且需要最少的代码。
What is the right way to work with async and await in Caliburn.Micro and still use the cal:Message.Attach="xyz" syntax?
您应该在 xyz
中捕获异常:
public async Task xyz()
{
try
{
//...
}
catch (Exception ex)
{
//handle...
}
}
如果你想在引导程序的 OnUnhandledException
中全局处理它,你应该将 return 类型从 Task
更改为 void
。方法 returning Task
被视为协程。