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);
  }
}