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