в чем суть обработки исключений - PullRequest
2 голосов
/ 30 июля 2010

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

Ответы [ 5 ]

4 голосов
/ 30 июля 2010

Когда вы бросаете исключение, вы говорите: «Что-то случилось, и я не могу справиться с этим здесь. Я передаю деньги!»

Когда вы ловите, вы говорите: «Хорошо, я могу что-то сделать. Возможно, повторить цикл и повторить попытку; возможно, зарегистрировать сообщение об ошибке» Вы даже можете игнорировать ошибку, но это обычно не рекомендуется.

Как правило, метатель фиксирует состояние сбоя, а сборщик воздействует на сбой. В реальной жизни исключения не всегда облегчают обработку ошибок; но это помогает не допустить ошибок в основной путь кода. Это альтернативный поток выполнения. Вы часто слышите это: «Исключения следует использовать только для исключительных вещей».

3 голосов
/ 30 июля 2010

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

Исключения составляют исключительные обстоятельства, а именно следующие два класса проблем:

  1. Ошибка программы
  2. Внешние проблемы

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

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

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

1 голос
/ 31 января 2011

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

1 голос
/ 30 июля 2010

Часто, я думаю, что лучший способ не поймать ошибку, особенно если у вас нет конкретного ответа на ошибку.В целом, я думаю, что подход «поймай и попробуй еще раз» имеет недостатки.Причина должна быть выявлена ​​и устранена.Вы не должны просто врезаться в кирпичную стену.

0 голосов
/ 30 июля 2010

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

Звучит так, будто у тебя нет общей идеи.

...