Где я должен ловить исключения при использовании ключевого слова «using» в коде? - PullRequest
11 голосов
/ 03 августа 2010

Какой из них лучше по структуре?

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 ]

7 голосов
/ 03 августа 2010

Либо хорошо, в зависимости от того, что вы собираетесь делать в улове.Если вам нужно использовать f в вашем улове, то это должно быть в операторе using.Однако в вашем примере нет никакой разницы.

РЕДАКТИРОВАТЬ: Как указано в другом месте, это также зависит от того, пытаетесь ли вы ловить только исключения, сгенерированные в блоке после использования или включения создания объекта в оператор использования.Если он находится в блоке после использования, то это как я описал.Если вы хотите перехватывать исключения, сгенерированные Foo f = new Foo(), вам нужно использовать первый метод.

2 голосов
/ 03 августа 2010

Я не думаю, что это имеет большое значение с точки зрения производительности.Есть небольшая разница, хотя;во втором примере f все еще доступен внутри обработчика исключений, в то время как в первом он вышел из области видимости.И наоборот, в первом примере будут обнаружены исключения в конструкторе Foo, а также в методе Dispose, а во втором - нет.

Либо может быть, а может и не быть тем, что вы хотите.

1 голос
/ 03 августа 2010

Использование только

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();
}
1 голос
/ 03 августа 2010

Первый - лучший. Если случится какое-то исключение, оно поймает.

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

Концепция использования заключается в том, что он будет располагать объект, созданный в using.i.e, он автоматически вызывает метод IDispose. Основываясь на требовании, используйте используя .

1 голос
/ 03 августа 2010

Первый лучше, потому что он поймает любые исключения, сгенерированные во время процесса удаления.Конечно, вы не должны выбрасывать исключения при утилизации, но вещи случаются.

1 голос
/ 03 августа 2010

Проверьте этот пост, чтобы лучше понять: http://www.ruchitsurati.net/index.php/2010/07/28/understanding-%E2%80%98using%E2%80%99-block-in-c/

Также прочитайте ответы на этот вопрос: Перехват исключений, сгенерированных в конструкторе целевого объекта блока Using

первый лучше

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);
        }
    }
}

потому что, если вы видите код IL этого блока try и catch, не переносите инициализацию объекта.

...