async异步任务取消后,如何处理它的异常

通过CancellationToken ctk控制的异步方法,你可以取消任务,但是当取消任务的时候,系统会报一个异常,你需要准确识别并捕获它,而不是笼统的使用catch (Exception e){} 来捕获。

特别是当流程需要【上一步】【下一步】操作的时候,你取消了当前步骤,那么就要做好try catch的收尾工作。

一、异步方法里面常见的异常类型

  • OperationCanceledException ——任务被取消:比如点击了【跳步骤】的按钮
  • TimeoutException ——任务超时:比如联网加载资源,网络被墙
  • NullReferenceException ——空引用:比如场景都跳转,你没有停止任务,还在继续访问一个slider的值
  • Exception ——其它未知异常

二、处理思路

精确捕获各种异常,分门别类的处理,不要笼统的用Exception类型来处理,有的异常,你需要层层外抛,而不是藏着掖着。

    try
    {
        await UniTask.Delay(100,cancellationToken:ctk);
        await asyncTaskFlow.FlowAsync(ctk);
    }
    catch (OperationCanceledException e)
    {
        Debug.Log($"任务被取消:{e.Message}");
    }
    catch (TimeoutException e)
    {
        Debug.LogError($"超时:{e.Message}");
    }
    catch (NullReferenceException e)
    {
        Debug.LogError($"空引用: {e.Message}");
    }
    catch (Exception e)
    {
        Debug.LogError($"未知异常: {e}");
    }
}

三、处理方法

我是嵌套调用的,为了跟踪和精细处理,原始错误层层外抛

    /// <summary>
    /// 自身旋转
    /// </summary>
    /// <param name="ctk"></param>
    /// <returns></returns>
    public async UniTask FlowAsync(CancellationToken ctk)
    {
        try
        {
            FlowStatusEvent.RaiseStatusChanged(instanceID, FlowStatus.Running);
            Debug.Log($"~~启动Rotate() {Time.realtimeSinceStartup}");
            await target.DoRotate(axis, () => speed, duration, ctk, restored);
            Debug.Log($"~~结束Rotate() {Time.realtimeSinceStartup}");
            FlowStatusEvent.RaiseStatusChanged(instanceID, FlowStatus.Completed);
        }
        catch (OperationCanceledException e)
        {
            Debug.Log($"{this_name}任务被取消:{e.Message}");
            FlowStatusEvent.RaiseStatusChanged(instanceID, FlowStatus.Canceled);
            throw;//层层上抛,让外面去捕获
        }
        catch (Exception e)
        {
            Debug.Log($"{this_name}任务异常:{e.Message}");
            FlowStatusEvent.RaiseStatusChanged(instanceID, FlowStatus.Failed);
            throw;//层层上抛,让外面去捕获
        }
    }

四、throw与throw new

  • 茴香豆的两个写法
    throw new Exception()   //抛出一个新的异常 
    throw;                  //抛出原始异常
  • 常见用法:
catch (Exception e)
{
    Debug.Log($"{this_name}任务异常:{e}");
    throw new Exception()   //抛出一个新的异常 
    throw;                  // 保留原始异常
}
  • 有何区别:
原始异常保留
stack trace 保留
token 保留
调试不会痛苦
代码转载自:https://pan.quark.cn/s/8ce4326d996e 对于在 CentOS 7 系统中修改网卡配置文件后无法使设置生效的情况,经过实践验证,可以通过使用 nmcli 命令来进行调整。完成修改之后,需要重新启动虚拟机以使更改生效,这样操作流程即告完成。如果设置仍然无法生效,则表明虚拟机在启动过程中所获取的 IP 地址配置并非针对 eth0,此时可以对其它网卡的配置文件进行修改或将其移除。在 CentOS 7 系统中,网络配置的管理机制与早期版本存在差异,主要体现为采用了 Network Manager 服务来负责网络接口的管理。在某些情形下,尽管修改了 `/etc/sysconfig/network-scripts` 目录下的 `ifcfg-eth0` 文件,但网络配置却未能即时生效。此类问题的发生通常源于 CentOS 7 采用了不同于以往的配置读取方法。接下来将具体阐述如何借助 nmcli 命令来处理这一挑战。 以 root 用户身份登录系统并打开终端界面。nmcli 是 Network Manager 提供的命令行界面工具,它支持在命令行环境下执行网络连接的建立、编辑、查询及管理任务。针对修改 eth0 网卡配置的需求,可以遵循以下步骤进行操作: 1. 导航至 `/etc/sysconfig/network-scripts` 目录: ``` cd /etc/sysconfig/network-scripts ``` 2. 检查该目录内是否存在 `ifcfg-eth0.bak` 文件,该备份文件可能是先前调整配置时遗留下来的,若存在可能造成冲突。若发现该文件,可以选择将其删除: ``` [root@localhost netw...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值