捕捉异常.您是否替换或包装using语句

Gaz*_*yer 0 c# exception-handling using

using语句不捕获异常.要捕获异常,您有两种选择:

1)打开使用并手动实现:

void MyFunc()
{
    StreamReader myReader = null;

    try
    {
        myReader = new StreamReader(path);
        //use myReader
    }
    catch (Exception e)
    {
        //do something with exception
    }
    finally
    {
        if (myReader != null)
            myReader.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

或2)保持使用,并将其包装在另一个try catch块中

void MyFunc()
{
    try
    {
        using (StreamReader myReader = new StreamReader(path))
        {
             //use myReader
        }
    }
    catch (Exception e)
    {
        //do something with exception
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,第二个看起来更整洁,特别是当你有多个using语句时,因为它更好地描述了流,并删除了显式声明,空检查和Dispose()调用.

但是,由于额外的尝试捕获开销有效地冗余,因此感觉不对.

什么是标准做法?

Cod*_*aos 6

异常处理结构的开销只是元数据.如果没有抛出异常,则没有运行时性能开销.与其他一些运行时不同,进入/离开异常处理条款在.net中是免费的.抛出异常时,运行时使用元数据和当前指令指针来确定要执行的处理子句.

我赞成第二个.释放资源和处理异常是不同的概念,因此它们在代码中分开是很自然的.