我有这段代码:
using (var requestStream = request.GetRequestStream())
{
byte[] data = Encoding.UTF8.GetBytes(xmlData);
requestStream.Write(data, 0, data.Length);
}
如果由于远程服务器关闭而导致我的请求失败,我该如何捕获错误?
我是否应该将using块扩展到try-catch-finally,或者在使用“using”块时是否有更优雅的方法?
(我只需要通过这种方式捕获服务器正在减少类型的错误 - 我需要向客户端显示这些错误,因为他们的服务器连接不充分,而不是因为我们的软件或其他东西的错误)。
答案 0 :(得分:7)
这里肯定有四种选择:
放弃using
,只有一个try
/ catch
/ finally
:
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
块中只放置一个catch
/ using
块:
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
在之外的<{1}}块而非内部。老实说,我认为你使用它并没有多大区别。
无论如何都要抓住更高级别的例外,例如在调用方法中。通常这是一种更好的方法,因为您可能希望从“更大”操作的角度以相同的方式处理来自多个“小”操作的一种类型的异常。
我个人赞成第二种方法或第四种方法。这是一个一致的变化:当我想要捕获异常时,我会引入一个using
/ try
块。 发生在catch
语句中的事实既不在这里也不在那里。它最终会有更多的嵌套,但我发现它很少发生,这不是问题。
答案 1 :(得分:1)
如果初始化失败,using
语句仍会抛出异常,因此您可以将其包装在自己的try/catch
块中。