Вложены ли вложенные файлы Try/Catch в плохую идею?

Скажем, у нас есть такая структура:

Try
  ' Outer try code, that can fail with more generic conditions, 
  ' that I know less about and might not be able to handle

  Try
    ' Inner try code, that can fail with more specific conditions,
    ' that I probably know more about, and are likely to handle appropriately
  Catch innerEx as Exception
    ' Handle the inner exception
  End Try

Catch outerEx as Exception
  ' Handle outer exception
End Try

Я видел некоторые мнения о том, что блокировка Try блокирует это, не рекомендуется, но я не мог найти никаких конкретных причин.

Этот плохой код? Если да, то почему?

Ответ 1

Есть определенные обстоятельства, когда они являются хорошей идеей, например, один метод try/catch для всего метода, а другой - внутри цикла, когда вы хотите обработать исключение и продолжить обработку остальной части коллекции.

На самом деле единственная причина сделать это, если вы хотите пропустить бит, который допустил ошибку и продолжить, вместо того, чтобы раскручивать стек и терять контекст. Открытие нескольких файлов в редакторе является одним из примеров.

Тем не менее, исключения должны (как следует из названия) быть исключительными. Программа должна обрабатывать их, но стараться избегать их как часть нормального потока выполнения. Они вычислительно дороги в большинстве языков (Python является одним заметным исключением).

Еще один метод, который может быть полезен, - перехват определенных типов исключений...

Try
    'Some code to read from a file

Catch ex as IOException
    'Handle file access issues (possibly silently depending on usage)
Catch ex as Exception
    ' Handle all other exceptions.
    ' If you've got a handler further up, just omit this Catch and let the 
    ' exception propagate
    Throw
End Try

Мы также используем вложенные try/catches в наших процедурах обработки ошибок...

    Try
        Dim Message = String.Format("...", )
        Try
            'Log to database
        Catch ex As Exception
            'Do nothing
        End Try

        Try
            'Log to file
        Catch ex As Exception
            'Do nothing
        End Try
    Catch ex As Exception
        'Give up and go home
    End Try

Ответ 2

На самом деле я не думаю, что вложенные блоки Try/Catch не имеют ничего неправильного, за исключением того, что они могут быть трудно ориентироваться и, скорее всего, являются признаком того, что вы можете сделать рефакторинг (внутренний Try/Catch в свой собственный метод, например).

Но я хочу ответить на этот комментарий:

' Outer try code, that can fail with more generic conditions, 
' that I know less about and might not be able to handle

Если вы не знаете, как обращаться с исключениями в конкретной ситуации, поверьте мне: не поймать их. Лучше разрешить краху вашего приложения (я имею в виду, вы знаете, запишите его, просто не проглатывайте его), чем поймать то, что вы не знаете, как восстановить, а затем позволить вашему приложению продолжать весело на своем пути в поврежденном состоянии, Поведение будет в лучшем случае непредсказуемым с этого момента.