如何使用嵌套函数处理异步代码中的异常?

How to handle exceptions in the code async using nested functions?

我正在尝试处理在执行一堆函数后抛出的异常。 我想将 try/catch 块放在调用堆栈的顶部,抛出的异常是在由 Task.Run 方法创建的异步代码中。 我用来尝试处理代码的代码如下:

static async Task Send()
    {
        try
        {
            await SendEmailAsync();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

    static Task<Boolean> SendEmailAsync()
    {
        return Task.Run(() =>
            SendEmail());
    }

    static Boolean SendEmail()
    {
        throw new Exception("message of exception");
    }

什么形式最好处理Exception方法中抛出的SendEmail,让处理变成Send方法?

此代码确实捕获了异常。你只是 运行 它在这样的控制台应用程序中:

void Main() { Send(); }

Main 退出并且进程终止,然后才能进行异常处理。使用 Send().Wait();.

在你的评论中你说:

In the real console app is not working...

我猜你有这样的代码

public static void Main()
{
    Send();
}

这将导致异步代码启动,并且因为您没有等待它结束,所以您的应用会立即关闭。所以你当然不会看到你的异常抛出,因为应用程序已经关闭。

试试这个:

public static void Main()
{
    Send().Wait();
}

这将导致您的主要方法直到任务结束。