异常不抛出一个异步任务配置
问题描述:
我有以下方法异常不抛出一个异步任务配置
public async Task<bool> Connect()
{
lock (_connectingLock)
{
if (_connecting)
throw new IOException("Already connecting");
_connecting = true;
}
try {
await tcpClient.ConnectAsync(...);
}
catch (SocketException e)
{
return false;
}
finally
{
lock (_connectingLock)
{
_connecting = false;
}
}
}
现在,我会希望Connect()
连续调用抛出IOException,但它不会发生!
可能是什么原因?
答
致电Connect()
不能直接抛出异常。异步方法不要抛出异常。相反,他们会返回任务,等待时,将抛出IOException
。 (即任务故障)
如果这不是你想要的,你应该分开电话:
public Task<bool> Connect()
{
// Eager validation of state...
lock (_connectingLock)
{
if (_connecting)
throw new IOException("Already connecting");
_connecting = true;
}
return ConnectImpl();
}
private async Task<bool> ConnectImpl()
{
try {
await tcpClient.ConnectAsync(...);
}
catch (SocketException e)
{
return false;
}
finally
{
lock (_connectingLock)
{
_connecting = false;
}
}
}
目前尚不清楚这是否是在这种情况下,适当不过。通常很好地抛出像ArgumentException
这样的东西,但如果错误并不代表调用代码本身的错误,我认为返回错误的任务反而没有问题。
看哪! NCrunch变绿了。干杯! – kasperhj 2013-04-04 17:14:22
这种情况也很简单,您可以使用'ContinueWith'而不是'await'来实现它,以便异常需要明确包装到结果任务中,而不是隐式地发生。 – Servy 2013-04-04 17:26:33