exception disappear when forgot to await an async method

Posted Chuck Lu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了exception disappear when forgot to await an async method相关的知识,希望对你有一定的参考价值。

https://github.com/aspnet/AspNetWebStack/issues/235

https://stackoverflow.com/questions/5383310/catch-an-exception-thrown-by-an-async-void-method

 

如果异常发生在1个async方法中,而调用这个方法的地方,没有做await。那么异常就会消失。

It‘s somewhat weird to read but yes, the exception will bubble up to the calling code - but only if you await or Wait() the call to Foo.

public async void DoFoo()
{
    try
    {
        await Foo();
    }
    catch (ProtocolException ex)
    {
          // The exception will be caught because you‘ve awaited
          // the call in an async method.
    }
}

//or//

public void DoFoo()
{
    try
    {
        Foo().Wait();
    }
    catch (ProtocolException ex)
    {
          /* The exception will be caught because you‘ve
             waited for the completion of the call. */
    }
}

Async void methods have different error-handling semantics. When an exception is thrown out of an async Task or async Task method, that exception is captured and placed on the Task object. With async void methods, there is no Task object, so any exceptions thrown out of an async void method will be raised directly on the SynchronizationContext that was active when the async void method started. - https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

Note that using Wait() may cause your application to block, if .Net decides to execute your method synchronously.

This explanation http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions is pretty good - it discusses the steps the compiler takes to achieve this magic.

 

Async/Await - Best Practices in Asynchronous Programming

 

以上是关于exception disappear when forgot to await an async method的主要内容,如果未能解决你的问题,请参考以下文章

Error: Exception was raised when calling event-notify

记一次Jenkins 打包异常 ERROR: Exception when publishing, exception message [Failure]

Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when tr

log4j2 exception when using elasticsearch

HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned(示例

在使用oracle创建存储过程部分代码: EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN RAISE;