异常不抛出一个异步任务配置

问题描述:

我有以下方法异常不抛出一个异步任务配置

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这样的东西,但如果错误并不代表调用代码本身的错误,我认为返回错误的任务反而没有问题。

+0

看哪! NCrunch变绿了。干杯! – kasperhj 2013-04-04 17:14:22

+0

这种情况也很简单,您可以使用'ContinueWith'而不是'await'来实现它,以便异常需要明确包装到结果任务中,而不是隐式地发生。 – Servy 2013-04-04 17:26:33