Как поймать и зарегистрировать исключение внутри оператора Using без использования try-catch?

Поскольку я знаю, что оператор Using встроен в реализацию Dispose() и Try-Catch. Поэтому я хочу знать несколько вещей

  1. Можно ли зарегистрировать исключение внутри оператора using без использования блока try-catch как внутри, так и вне оператора. Если нет, то почему это встроено в утверждение.

  2. Вложенность или чрезмерное использование try-catch не является предпочтительным, поэтому такая модель предпочтительнее для использования.

            using (some_resource)
            {
                try
                {
                }
                catch
                {
                }
                finally
                {
                    //my exception logging mechanism
                }
            }
    

станет

            try
            {
                try
                {
                }
                catch
                {
                }
                finally
                {
                    //my exception logging mechanism
                }
            }
            catch
            {
            }
            finally
            {
                //some_resource.Dispose()
            }

person Community    schedule 11.07.2013    source источник
comment
using не переводится как try-catch, только try-finally.   -  person Blorgbeard    schedule 11.07.2013
comment
Разве механизм ведения журнала исключений не должен быть внутри «улова», а не «наконец»?   -  person Botis    schedule 11.07.2013
comment
откуда вы черпаете свои предпочтения?   -  person Jodrell    schedule 11.07.2013


Ответы (2)


Оператор using включает try/finally; нет catch. Но, честно говоря, ваша забота чрезмерна; многовложенные и сложные try/catch/finally "нежелательны", потому что:

  • это затрудняет чтение кода
  • и еще труднее понять правильно (большинство людей ошибаются, увы)
  • им часто злоупотребляют
  • это говорит о том, что ваш метод делает слишком много

С using это не проблема; это делает намерение очень чистым, не добавляя сложности или беспокойства.

Я бы просто использовал:

using (some_resource) {
    try {
        // some code
    } catch (Exception ex) {
        LogIt(ex);
        throw;
    }
}
person Marc Gravell    schedule 11.07.2013