C#:在没有 [await] 的情况下调用 [async] 方法不会捕获其抛出的异常?
C#: calling [async] method without [await] will not catch its thrown exception?
我有这个代码片段:
class Program
{
public static async Task ProcessAsync(string s)
{
Console.WriteLine("call function");
if (s == null)
{
Console.WriteLine("throw");
throw new ArgumentNullException("s");
}
Console.WriteLine("print");
await Task.Run(() => Console.WriteLine(s));
Console.WriteLine("end");
}
public static void Main(string[] args)
{
try
{
ProcessAsync(null);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
}
它运行并打印:
call function
throw
好的,抛出异常,但是主函数的 try/catch 无法捕获异常,如果我删除 try/catch,主函数也不会报告未处理的异常。这很奇怪,我用谷歌搜索了一下,它说 [await] 中有陷阱,但没有解释如何以及为什么。
所以我的问题是,为什么这里没有捕获到异常,使用await有什么陷阱?
非常感谢。
Within an async
method, any exceptions are caught by the runtime and placed on the returned Task
。如果您的代码忽略 async
方法返回的 Task
,则它不会观察到这些异常。大多数任务都应该 await
在某个时候进行编辑以观察它们的结果(包括例外情况)。
最简单的解决方案是让您的 Main
异步:
public static async Task Main(string[] args)
{
try
{
await ProcessAsync(null);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
我有这个代码片段:
class Program
{
public static async Task ProcessAsync(string s)
{
Console.WriteLine("call function");
if (s == null)
{
Console.WriteLine("throw");
throw new ArgumentNullException("s");
}
Console.WriteLine("print");
await Task.Run(() => Console.WriteLine(s));
Console.WriteLine("end");
}
public static void Main(string[] args)
{
try
{
ProcessAsync(null);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
}
它运行并打印:
call function
throw
好的,抛出异常,但是主函数的 try/catch 无法捕获异常,如果我删除 try/catch,主函数也不会报告未处理的异常。这很奇怪,我用谷歌搜索了一下,它说 [await] 中有陷阱,但没有解释如何以及为什么。
所以我的问题是,为什么这里没有捕获到异常,使用await有什么陷阱?
非常感谢。
Within an async
method, any exceptions are caught by the runtime and placed on the returned Task
。如果您的代码忽略 async
方法返回的 Task
,则它不会观察到这些异常。大多数任务都应该 await
在某个时候进行编辑以观察它们的结果(包括例外情况)。
最简单的解决方案是让您的 Main
异步:
public static async Task Main(string[] args)
{
try
{
await ProcessAsync(null);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}