Исключения: когда обработка одинакова, один блок или много? - PullRequest
2 голосов
/ 05 апреля 2011

В ситуациях, когда обработка ошибок одинакова (я повторяю ошибку и передаю данные $_POST обратно в форму), есть ли причина разделять код на несколько блоков try-catch? У меня есть команда get, которая может завершиться ошибкой, если был передан неверный идентификатор; У меня есть сеттеры, которые не работают, если запись не проверяется; и у меня есть write, который завершается ошибкой, если не удается записать в базу данных или произошла поздняя проверка. Предположим, что на этой странице все исключения приводят к тому, что пользователю отображается одно и то же уведомление (конечно, с помощью $e->getMessage()). Так что, кажется, лучше пойти с ...

// Try the whole block
try {
    $var = $manager->get($id);
    $var->setFoo('bar');
    $var->setShazbot('fnord');
    $manager->write($var);
}
catch (DataException $e) {
    echo $e->getMessage();
}
catch (ValidationException $e) {
    echo $e->getMessage();
}

или ...

// Try getting
try {
    $var = $manager->get($id);
}
catch (DataException $e) {
    echo $e->getMessage();
}

// Try setting
try { 
    $var->setFoo('bar');
    $var->setShazbot('fnord');
}
catch (ValidationException $e) {
    echo $e->getMessage();
}

// Try committing
try {
    $manager->write($var);
}
catch (DataException $e) {
    echo $e->getMessage();
}

Теперь, имейте в виду, опять же, что в этом примере все три блока catch делают одно и то же . Тем не менее, получение, проверка и запись - три разные вещи, и я подумал, что было бы более разумно попытаться поймать их по отдельности, а не все сразу. Что имеет больше смысла?

Ответы [ 3 ]

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

Это тот случай, когда речь идет не о стиле.На самом деле все зависит от того, что вы хотите, чтобы ваш код делал, когда выдается исключение.

Зависит ли оператор в блоке от правильной работы?Являются ли они логической группировкой, которую нужно прекратить в случае сбоя одного вызова?

Если это так, то оберните их все в один блок и обработайте исключения там.

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

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

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

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

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

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