Являются ли вложенные блоки Try / Catch плохой идеей? - PullRequest
71 голосов
/ 26 января 2011

Допустим, у нас есть такая структура:

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 ]

75 голосов
/ 26 января 2011

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

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

При этом исключения (как следует из названия) должны быть исключительными.Программа должна обрабатывать их, но стараться избегать их как часть нормального потока выполнения.Они вычислительно дороги в большинстве языков (одним заметным исключением является 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 / catch в наших процедурах обработки ошибок ...

    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
34 голосов
/ 26 января 2011

Я на самом деле не думаю, что в вложенных блоках 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 it; просто не глотайте его), чем поймать что-то, от чего вы не знаете, как восстановиться, и затем позволить вашему приложению весело продолжатьего путь в испорченном состоянии.Поведение будет непредсказуемым в лучшем случае с этого момента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...