繁体   English   中英

在异步方法中捕获异常

[英]Catching an exception in an async method

我正在尝试更加熟悉异步/等待编程和异常处理。

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下捕获Exception

首先,处理您的异常。 我相信您会看到代码停止执行并显示错误,因为您将Break When Thrown ”。 检查您的例外窗口( Debug -> Windows -> Exception Settings Windows- Debug -> Windows -> Exception Settings )。

当您在async方法上使用void的返回类型时,您将无法从该方法获取任何类型的信息-这是一劳永逸的事情。 除特殊情况外,这是不好的做法。 始终让您的异步方法返回TaskTask<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来取消任务的包装,但这在应用程序入口点是不允许的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM