在代码中使用'“using”关键字时,我应该在哪里捕获异常?

时间:2010-08-03 10:13:29

标签: c# performance exception-handling

哪一个结构更好?

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using (Foo f = new Foo())
            {
                //some commands that potentially produce exceptions.
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

...或

class Program
{
    static void Main(string[] args)
    {

        using (Foo f = new Foo())
        {
            try
            {
                //some commands that potentially produce exceptions.
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

    }
}

6 个答案:

答案 0 :(得分:7)

要么是好的,取决于你将要捕获的内容。如果你需要在catch中使用f,那么它需要在using语句中。但是在你的例子中没有区别。

编辑: 正如其他地方所指出的那样,它还取决于您是否尝试在使用或包含using语句中的对象创建之后捕获块中生成的异常。如果它在使用之后的块中那么它就像我描述的那样。如果要捕获Foo f = new Foo()生成的异常,则需要使用第一种方法。

答案 1 :(得分:2)

我认为这不重要,性能方面。但是有一点点差异;在第二个示例中,f仍然在异常处理程序中可用,而在第一个示例中,它已超出范围。相反,在第一个示例中,将捕获Foo构造函数中的异常及其Dispose方法,而在第二个示例中,它们不会。

可能是也可能不是你想要的。

答案 2 :(得分:1)

查看此帖子以便更好地了解:http://www.ruchitsurati.net/index.php/2010/07/28/understanding-%E2%80%98using%E2%80%99-block-in-c/

同时阅读此问题的答案:Catching exceptions thrown in the constructor of the target object of a Using block

第一个是下一个

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using (Foo f = new Foo())
            {
                //some commands that potentially produce exceptions.
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

因为如果你看到这个try和catch块的IL代码没有包装对象的inialization。

答案 3 :(得分:1)

第一个更好,因为它将捕获在处置过程中抛出的任何异常。当然,在处理时你不应该抛出任何异常,但事情会发生。

答案 4 :(得分:1)

第一个是更好的一个。如果有任何异常,它将会捕获。

 try
    {
        using (Foo f = new Foo())
        {
            //some commands that potentially produce exceptions.
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

使用的概念是它将处理在using.i.e中创建的对象,它会自动调用IDispose方法。根据要求使用using

答案 5 :(得分:1)

使用只是

Foo f = null;
try
{
   f = new Foo();
}
finally
{
   if (f is IDisposable)
       f.Dispose();
}

看到你可以实现捕获这样的异常:

Foo f = null;
try
{
   f = new Foo();
}
catch (Exception ex)
{
    // handle exception
}
finally
{
   if (f is IDisposable)
       f.Dispose();
}