我在使用异步 CTP 时遇到问题,试图找出处理异常的正确方法是什么。下面的代码使我的程序崩溃,据我所知,await
应该在调用它的上下文中捕获并重新抛出异常,因此Not caught!
块应该捕获异常。
try {
await TaskEx.Run(() => {
throw new Exception();
});
} catch {
// Not caught!
}
感谢您的任何帮助或建议。
使用测试版(而不是 CTP,因此TaskEx
成为Task
)对我来说效果很好:
using System;
using System.Threading.Tasks;
class Test
{
static void Main()
{
Task t = Foo();
t.Wait();
}
static async Task Foo()
{
try
{
await Task.Run(() => { throw new Exception(); });
}
catch (Exception e)
{
Console.WriteLine("Bang! " + e);
}
}
输出:
Bang! System.Exception: Exception of type 'System.Exception' was thrown.
at Test.<Foo>b__0()
at System.Threading.Tasks.Task`1.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter
.HandleNonSuccessAndDebuggerNotification(Task task)
at Test.<Foo>d__2.MoveNext()
相同的代码在您的机器上做了什么?
专业提示:Visual Studio告诉您该异常未处理,但如果您按 F5,您将看到它确实被捕获。
(这来自对乔恩答案的评论,但我认为它应该有自己的答案)
一点点重新排列应该可以工作:
await TaskEx.Run(() => {
try {
throw new Exception();
} catch {
// Caught!
}
});
编辑:
由于我也在运行 VS11 测试版,因此我得到了与Jon Skeet相同的结果。我不能代表 CTP。