0

根据此网页上所写的内容,如果我理解正确,该using语句的工作方式类似于 a try/finally,因此我可能会错误地认为,如果语句中发生异常using,它不应该使程序崩溃。

但是,当DownloadString下面示例中显示的方法抛出 aWebException时,程序会崩溃。

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}

这是正常的,因为该using语句不像 a 那样工作try/catch/finally,所以实际上没有处理任何异常。但后来我想知道该声明的目的是什么using

更新...根据下面的回复,我添加了以下注意事项。基本上,如果我需要处理异常,可能的解决方案如下。

  1. using语句放在try/catch块中。
  2. 仅将DonwloadString方法放在try/catch块内。
  3. 手动编写 try/catch/finally 块,如下面的代码示例所示。

第三种解决方案的示例代码。

WebClient client = new WebClient();
try
{
    string response = client.DownloadString(url);
    // ...
}
catch(Exception ex)
{
    // handle (or ignore) the exception
}
finally
{
    if (client != null)
        client.Dispose();
}
4

5 回答 5

5

如果我理解正确,using 语句就像 try/finally

正确的。

所以我希望如果在 using 语句中发生异常,它不应该使程序崩溃。

不正确。

try/finally没有using语句吞下异常——如果你没有捕捉到异常,它会向上传播。如果它未被捕获,它通常会终止该过程。(根据它所在的线程以及 CLR 的配置方式,在某些情况下它不会,但这是另一回事。)

但后来我想知道 using 语句的目的是什么。

为了更简单地编写需要处理资源的代码。就这样。如果我们没有using语句,我们就会有很多try/finally块,它们只是调用了... Dispose,这会更难看。(去过那里,做到了——在 Java 7 引入 try-with-resources 语句之前,这就是 Java。)

于 2014-02-27T23:28:45.943 回答
3

一条using语句不会使所有异常神奇地消失,它只是意味着如果确实发生了该IDisposable.Dispose方法,则在对象上正确调用该方法。client这对于确保释放任何非托管资源很重要。

它将重新抛出任何发生的异常,您仍然必须在自己的代码中处理它们。

于 2014-02-27T23:28:56.477 回答
0

见 MSDNusing声明的描述

简而言之,.Dispose()即使发生异常, using 也能确保调用它。然而,它并没有阻止异常做它的事情。

于 2014-02-27T23:28:38.820 回答
0

using 语句没有 catch,只有 finally,因此会为您处理资源。如果 using 语句要捕获所有异常并继续运行,那将是调试的一大障碍。

于 2014-02-27T23:29:22.417 回答
0

使用和阅读更简单、更快捷

你自己看

var myVar = null
try
{
    my = new Object();
    //Do stuff
}
finally
{
    if(myVar != null)
        myVar.Dispose()
}

对比

using(var myVar = new Object())
{
    //Do stuff
}

它只是为了确保在该对象上调用Dispose 。using不做任何异常处理,因为 try/finally 也不做

于 2014-02-27T23:30:25.173 回答