根据此web page上的内容,如果我理解正确,using
语句就像try/finally
一样,所以如果发生异常,我可能会错误地预期在using
语句中,它不应该使程序崩溃。
但是,当DownloadString
方法(如下例所示)抛出WebException
时,程序崩溃。
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
这是正常的,因为using
语句不像try/catch/finally
那样工作,实际上没有处理异常。但后来我想知道using
陈述的目的是什么。
更新... 根据以下回复,我添加了以下注意事项。基本上,如果我需要处理异常,可能的解决方案如下:
using
语句放在try/catch
块中。DonwloadString
方法放在try/catch
块中。第三种解决方案的示例代码。
WebClient client = new WebClient();
try
{
string response = client.DownloadString(url);
// ...
}
catch(Exception ex)
{
// handle (or ignore) the exception
}
finally
{
if (client != null)
client.Dispose();
}
答案 0 :(得分:5)
如果我理解正确,using语句就像try / finally
一样
正确。
所以我希望如果在using语句中发生异常,它不应该使程序崩溃。
不正确的。
try/finally
和using
语句都不会吞下异常 - 如果你没有捕获异常,它会向上传播。如果它没有被捕获,它通常会终止该过程。 (根据它所处的线程和CLR的配置方式,有一些情况不会发生,但这是另一回事。)
但后来我想知道使用声明的目的是什么。
使编写需要处理资源的代码变得更加简单。就这样。如果我们没有using
语句,我们就会有一个很多的try
/ finally
块,这些块刚刚调用Dispose
...这将是相当丑陋的。 (去过那里,完成了 - 直到Java 7引入了try-with-resources语句,这就是Java。)
答案 1 :(得分:3)
using
语句不会使所有异常神奇地消失,只是意味着IDisposable.Dispose
方法在client
对象上正确调用(如果确实发生了)。这对于确保释放任何非托管资源非常重要。
它将重新抛出任何发生的异常,您仍然需要在自己的代码中处理它们。
答案 2 :(得分:0)
See MSDN description of using
statement
简而言之,即使发生异常,使用也可确保调用.Dispose()
。然而,它并没有阻止异常做这件事。
答案 3 :(得分:0)
using语句没有catch,只有finally,因此为您处理资源。如果using语句要捕获所有异常并继续运行,那将是调试的一大障碍。
答案 4 :(得分:0)
使用和阅读更简单,更快捷
亲自看看
var myVar = null
try
{
my = new Object();
//Do stuff
}
finally
{
if(myVar != null)
myVar.Dispose()
}
VS
using(var myVar = new Object())
{
//Do stuff
}
只是为了确保在该对象上调用 Dispose 。 使用不进行任何异常处理,因为try / finally不是