首页 > 后端开发 > C++ > Async Void 方法中抛出的异常可以通过调用方法捕获吗?

Async Void 方法中抛出的异常可以通过调用方法捕获吗?

Barbara Streisand
发布: 2025-01-24 02:43:10
原创
392 人浏览过

Can Exceptions Thrown in Async Void Methods Be Caught by Calling Methods?

异步void方法的异常处理

在使用微软的异步CTP进行异步编程时,理解异步void方法的异常处理行为至关重要。考虑以下场景:

<code class="language-csharp">public async void Foo()
{
    var x = await DoSomethingAsync();
}

public void DoFoo()
{
    try
    {
        Foo();
    }
    catch (ProtocolException ex)
    {
        // 异常将永远不会被捕获。
    }
}</code>
登录后复制

问题是:在调用方法DoFoo中能否捕获异步方法Foo中抛出的异常?

答案:可以(但有前提条件)

异常确实会冒泡到调用代码,但前提是您需要awaitWait() Foo的调用。修改代码如下:

<code class="language-csharp">public async Task Foo()
{
    var x = await DoSomethingAsync();
}

public async void DoFoo()
{
    try
    {
        await Foo();
    }
    catch (ProtocolException ex)
    {
        // 异常将被捕获,因为它是一个异步方法。
    }
}

public void DoFoo()
{
    try
    {
        Foo().Wait();
    }
    catch (ProtocolException ex)
    {
        // 异常将被捕获,因为调用被等待。
    }
}</code>
登录后复制

这样就能在调用代码中进行异常处理。

然而,需要注意的是,异步编程领域的权威人士Stephen Cleary警告说:

“异步void方法具有不同的错误处理语义。当从异步Task或异步Task<T>方法抛出异常时,该异常会被捕获并放置在Task对象上。对于异步void方法,没有Task对象,因此从异步void方法抛出的任何异常都将直接在启动异步void方法时活动的SynchronizationContext上引发。”

此外,使用Wait()等待任务完成可能会阻塞应用程序,如果.NET决定同步执行该方法的话。

以上是Async Void 方法中抛出的异常可以通过调用方法捕获吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板