блоки.

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

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

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

 Hans Passant26 янв. 2011 г., 01:07
Не уверен, насколько точен этот фрагмент. Но нет такого чертова фаллоимитатора, которого вы действительно знаете, когда ловите Exception. Может бытьчто-нибудь, Рассмотрите возможность использования предложения When, которое поддерживает VB.NET.

Ответы на вопрос(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
 gooch25 янв. 2011 г., 23:56
Регистрация в фоновом потоке - это место, где я буду использовать внутреннюю попытку / улов. Я не хочу, чтобы метод заканчивался, потому что он не мог задокументировать, что он делал.
 Basic25 янв. 2011 г., 23:59
@ Верно, я тоже так делаю, я добавлю это в свой ответ.

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

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

 Goro26 янв. 2011 г., 00:04
Это правда. На момент ловли внешнего исключения я бы не хотел продолжать. Я больше думал о возможности корректно завершить работу / перезапустить приложение, а не шокировать пользователя "ужасным сбоем"
 Dan Tao26 янв. 2011 г., 00:07
@Goro: В этом случае я бы порекомендовал механизм обработки исключений для всего приложения (например, если это WinForms, обработайтеApplication.UnhandledException событие), а не на методTry/Catch блоки.

Ваш ответ на вопрос