Где я должен поймать исключения при использовании '“использования” ключевого слова в коде?

Какой лучше в структуре?

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

    }
}
11
задан xport 3 August 2010 в 10:16
поделиться

6 ответов

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

И то, и другое может быть или не быть тем, что вам нужно.

2
ответ дан 3 December 2019 в 08:53
поделиться

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

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
ответ дан 3 December 2019 в 08:53
поделиться

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

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

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

1
ответ дан 3 December 2019 в 08:53
поделиться

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

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

7
ответ дан 3 December 2019 в 08:53
поделиться

Проверьте этот пост, чтобы лучше понять: 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 and catch не завершает инициализацию объекта.

1
ответ дан 3 December 2019 в 08:53
поделиться

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

1
ответ дан 3 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: