C#"使用"语法

Gor*_*son 46 c# using exception using-statement

use会捕获异常还是抛出异常?即

using (StreamReader rdr = File.OpenText("file.txt"))
{
 //do stuff
}
Run Code Online (Sandbox Code Playgroud)

如果streamreader抛出异常是通过使用或抛出来捕获的,那么调用函数可以处理它吗?

jop*_*jop 62

当您看到using语句时,请考虑以下代码:

StreadReader rdr = null;
try
{
    rdr = File.OpenText("file.txt");
    //do stuff
}
finally
{
    if (rdr != null)
        rdr.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

所以真正的答案是它不会对使用块体内抛出的异常做任何事情.它不处理它或重新抛出它.


Fly*_*wat 32

使用语句不要吃异常.

所有"使用"的作用都是将对象作为使用块的范围,并在对象离开块时自动调用对象上的Dispose().

但是,如果一个线程被外部源强制中止,则可能永远不会调用Dispose.

  • 根据http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx,catch和finally语句仍然执行.由于"using"编译为finally块,因此将处理示例中的stread reader. (13认同)
  • 我相当肯定你的"陷阱"不准确.由于StreamReader类实现了IDisposable,因此using语句将负责处理对象.因为using语句的作用类似于finally块,所以如果您有异常或返回则无关紧要. (8认同)

Chr*_*org 16

using允许例外通过.它就像一个try/finally,最终处理使用过的对象.因此,它仅适用于实现的对象IDisposable.


ste*_*yer 5

它会抛出异常,因此要么包含方法需要处理它,要么将其传递给堆栈.

try
{
    using (
        StreamReader rdr = File.OpenText("file.txt"))
    { //do stuff 
    }
}
catch (FileNotFoundException Ex)
{
    // The file didn't exist
}
catch (AccessViolationException Ex)
{
    // You don't have the permission to open this
}
catch (Exception Ex)
{
    // Something happened! 
}
Run Code Online (Sandbox Code Playgroud)