C#中的Async的异常处理

在C#的代码编写中可以通过try/catch来捕获Exception。然而当调用Async方法时需要特别注意

private void Start()
{
   
    try
    {
   
        TestVoid();
    }
    catch (Exception e)
    {
   
        Debug.LogException(e);
    }
}

private async void TestVoid()
{
   
    var t = Task.Delay(1);

    await t;

    throw new Exception("TestVoid");
}

上面代码的本意是在执行TestVoid时,发现异常将异常打印出来,然而运行之后发现什么都没有发生。下面我们将一步步揭开面纱。

private void Start()
{
   
    TestTask().ContinueWith(task =>
    {
   
        if (task.IsFaulted)
        {
   
            Debug.LogException(task.Exception);
        }
    });
}

private async Task TestTask()
{
   
    var t = Task.Delay(1);

    await t;
    throw new Exception("TestTask");
}

上面的代码和第一个代码的区别是将test函数的返回值由void改成了Task,然后在调用的地方使用ContinueWith来捕获异常。上面的代码执行后可以正常打印出错误信息。

再看另一种写法

private void Start()
{
   
    TestTaskInternal();
}

private async Task TestTaskInternal()
{
   
    try
    {
   
        await TestTask();
    }
    catch (Exception e)
    {
   
        Debug.LogError(e);
    }
}

上面的代码和第二处的代码对比,仅仅是将TestTask放在了Task中执行。

结论:

  1. 非async方法调用async方法不能直接使用try/catch,需要使用ContinueWith来捕获Exception
  2. async方法内部可以使用try/catch捕获Exception
  3. 如果方式是async的,原则需要将返回值也修改成Task/Task<>

相关推荐

  1. C#Async异常处理

    2024-02-22 12:30:02       47 阅读
  2. C# async void 、 async Task与async Task<TResult>

    2024-02-22 12:30:02       45 阅读
  3. spring异步@Async方法request丢失问题处理

    2024-02-22 12:30:02       31 阅读
  4. vueasync

    2024-02-22 12:30:02       26 阅读
  5. Python 异常处理

    2024-02-22 12:30:02       70 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-22 12:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-22 12:30:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-22 12:30:02       82 阅读
  4. Python语言-面向对象

    2024-02-22 12:30:02       91 阅读

热门阅读

  1. k8s学习整理文档

    2024-02-22 12:30:02       41 阅读
  2. JVM知识——安全点

    2024-02-22 12:30:02       50 阅读
  3. Golang 语法系列:结构体

    2024-02-22 12:30:02       51 阅读
  4. 深入理解Go语言中的Channel与Select

    2024-02-22 12:30:02       48 阅读
  5. 爬虫基本库的使用(urllib库的详细解析)

    2024-02-22 12:30:02       43 阅读
  6. 一个简单的linux 的shell脚本 循环

    2024-02-22 12:30:02       51 阅读
  7. C#知识点-17(正则表达式)

    2024-02-22 12:30:02       47 阅读
  8. Conda常用命令

    2024-02-22 12:30:02       45 阅读
  9. MySQL的多种约束

    2024-02-22 12:30:02       38 阅读
  10. 暴雨信创助力金融数字化转型

    2024-02-22 12:30:02       55 阅读