在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<>