在异步方法中捕获异常
本文关键字:捕获异常 异步方法 | 更新日期: 2024-12-05 21:25:59
我正在尝试更熟悉异步/等待编程和异常处理。
static void Main(string[] args)
{
TestAsyncException();
}
private static async void TestAsyncException()
{
try
{
var result = await Task.Factory.StartNew(() => DoSomething());
//do something with the result
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
private static int DoSomething()
{
throw new Exception("Exception was thrown!");
}
我希望Exception
得到优雅处理,但代码执行停止,我得到
在.. 中发生了类型为"System.Exception"的异常,但未 在用户代码中处理。
但是当我继续执行代码时,Exception
实际上被捕获(并且消息会显示给Console
)。
我应该如何在不破坏代码执行的情况下捕获Exception
?
首先,处理您的异常。 我相信您看到代码停止执行并显示错误,因为您已经Break When Thrown
异常。 检查您的异常窗口 ( Debug -> Windows -> Exception Settings
)。
当您在async
方法上使用返回类型的void
时,您无法从该方法中获取任何类型的信息 - 即发即弃。 除非在特定情况下,否则这是不好的做法。 始终让您的异步方法返回Task
或Task<T>
:
private static async Task TestAsyncException()
现在,您的主要方法可以侦听任务:
static void Main(string[] args)
{
TestAsyncException().Wait(); // or whatever you want to do with the task
Console.Read();
}
通常,您可以使用await
在此处解包任务,但这在应用程序入口点中是不允许的。