Вложенные блоки 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 такие блоки обескуражены, но я не мог найти никаких конкретных причин.

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

2 66

2 ответа:

есть определенные обстоятельства, когда они являются хорошей идеей, например, один 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

Я на самом деле не думаю, что есть что-то изначально неправильное о вложенных 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

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