Разве можно поймать исключение и ничего не делать? - PullRequest
9 голосов
/ 28 апреля 2011
try
{

    CallMethod()

}
catch { }

Исходя из моего опыта, я бы вообще этого не делал.

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

Если нет, то какая у меня альтернатива?

Ответы [ 6 ]

11 голосов
/ 28 апреля 2011

Конечно, бывают времена, но они должны быть крайне редкими.

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

7 голосов
/ 28 апреля 2011

Пустой блок захвата, подобный показанному, не должен использоваться.

Например, код в вашем вопросе также будет перехватывать OutOfMemoryException, StackOverflowException, ExecutionEngineException, AccessViolationException и ThreadAbortException (хотя последний будет переброшен в конце блока catch). Он даже будет ловить объекты, которые не являются производными от System.Exception (редко, но возможно в управляемых C ++ и JavaScript ... в CLR любой объект может быть «брошен», но C # ограничивает вас типами, производными от Exception).

Если в вашем примере вы используете сторонний COM-объект, который иногда дает сбой и вас не волнует этот сбой, вы должны вместо этого перехватить (COMException) {}, чтобы другие более серьезные сбои всплыли 'и могут быть зарегистрированы и / или исправлены.

Важно отлавливать только те исключения, с которыми вы действительно можете что-то делать (в этом случае вы явно решаете ничего не делать с исключениями, возникающими из CallMethod (), и я согласен, что для этого следует добавить комментарий. дизайнерское решение). Следуя этому руководству, вы не допускаете, чтобы другие ошибки и проблемы в коде или среде выполнения оставались незамеченными.

3 голосов
/ 28 апреля 2011

Я бы, по крайней мере, регистрировал вхождение с "Предупреждение" или более низким уровнем в блоке перехвата, чтобы вы всегда могли включить ведение журнала и посмотреть, что происходит, если вам тоже нужно.

2 голосов
/ 28 апреля 2011

Как правило, вы хотите, чтобы ваш код обрабатывал ошибки каким-либо образом.

Тем не менее, если вы готовы справиться с последствиями неудачного молчания, продолжайте.

0 голосов
/ 28 апреля 2011

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

0 голосов
/ 28 апреля 2011

Ваш сторонний компонент не работает. Как это терпит неудачу? Это терпит неудачу последовательно предсказуемым (хотя и ошибочным по времени) способом? Вы получаете TakingABreakException? Если это так, поймайте предсказуемое исключение, сделайте с ним что угодно, запишите его и т. Д., , и пусть все остальное всплывет .

Делай не лови все, если сможешь поймать одну вещь, о которой ты знаешь, случается время от времени. То, что может сломать сейчас , возможно, не является сторонним компонентом, или оно может плохо работать из-за ввода, который вы могли использовать. Эти вещи не следует проглатывать.

...