1

我有这个代码:

using (var requestStream = request.GetRequestStream())
{
    byte[] data = Encoding.UTF8.GetBytes(xmlData);
    requestStream.Write(data, 0, data.Length);
}

如果我发出的请求因为远程服务器关闭而失败,我该如何捕捉错误?

我应该将 using 块扩展为 try-catch-finally,还是在使用“using”块时有更优雅的方式来完成?

(我需要以这种方式仅捕获服务器停机类型错误 - 我需要向客户端显示这些错误的发生是因为他们的服务器连接不足,而不是因为我们的软件或其他东西中的错误)。

4

2 回答 2

7

这里肯定有四种选择:

  • 放弃,using只拥有一个try// catchfinally

    var requestStream = request.GetRequestStream();
    try
    {
        byte[] data = Encoding.UTF8.GetBytes(xmlData);
        requestStream.Write(data, 0, data.Length);
    }
    catch (IOException e) // Or whatever
    {
        // Whatever you want
    }
    finally
    {
        requestStream.Dispose();
    }
    
  • 在块内放一个try/块:catchusing

    using (var requestStream = request.GetRequestStream())
    {
        try
        {
            byte[] data = Encoding.UTF8.GetBytes(xmlData);
            requestStream.Write(data, 0, data.Length);
        }
        catch (IOException e) // Or whatever
        {
            // Whatever you want
        }
    }
    
  • 与第二个选项相同,但在块外部try而不是内部使用/ 。老实说,我不认为你使用哪个有很大的不同。catch using

  • 无论如何,在更高级别捕获异常,例如在调用方法中。通常这是一种更好的方法,因为您可能希望从“较大”操作的角度以相同的方式处理多个“小”操作中的一种异常。

就我个人而言,我一般倾向于第二种方法或第四种方法。这是一个一致的变化:当我想捕获异常时,我引入了try/catch块。它恰好在语句中的事实using既不存在也不存在。它以更多的嵌套结束,但我发现它很少发生,这不是问题。

于 2013-06-05T06:22:35.187 回答
1

如果初始化失败,该using语句仍然会抛出异常,因此您可以将其包装在自己的try/catch块中。

于 2013-06-05T06:21:45.907 回答