在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中执行。
结论:
- 非async方法调用async方法不能直接使用try/catch,需要使用ContinueWith来捕获Exception
- async方法内部可以使用try/catch捕获Exception
- 如果方式是async的,原则需要将返回值也修改成Task/Task<>