根据本文所写内容 网页, ,如果我理解正确的话, using 声明的作用就像 try/finally, ,所以我可能会错误地期望如果异常发生在 using 声明,它不应该使程序崩溃。

然而,当 DownloadString 方法,如下面的示例所示,抛出一个 WebException, ,程序崩溃。

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

这是正常的,因为 using 声明不像 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();
}
有帮助吗?

解决方案

如果我理解正确的话,using 语句的作用类似于 try/finally

正确的。

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

不正确。

两者都不 try/finally 也不 using 语句吞掉异常——如果你不捕获异常,它就会向上传播。如果未被捕获,通常会终止该进程。(在某些情况下它不会,具体取决于它所在的线程以及 CLR 的配置方式,但这是另一回事。)

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

使编写需要处理资源的代码变得更简单。就这样。如果我们没有 using 声明,我们会有一个 很多try/finally 刚刚调用的块 Dispose...那会更加难看。(就在那里,完成了 - 这就是 Java,直到 Java 7 引入了 try-with-resources 语句。)

其他提示

A using 声明并不会让所有异常神奇地消失,它只是意味着 IDisposable.Dispose 方法被正确调用 client 如果确实发生,则反对。这对于确保释放所有非托管资源非常重要。

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

参见MSDN的描述 using 陈述

简而言之,使用可以确保 .Dispose() 即使发生异常也会被调用。但是,它不会阻止异常执行其操作。

使用语句没有捕获,只有一个最终并因此为您处置资源。如果使用陈述是为了捕获所有例外并继续运行它将是调试的一个大障碍。

它简单地使用和阅读

看你自己

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

vs

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

简单地确保在该对象上调用 dispose 。使用使用不做任何例外处理,因为尝试/最终没有

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top