Почему некоторые люди возвращаются после того, как они выбрасывают Исключения?
Я вижу в некоторых из кода Github
if($something_funky_happens){
throw new \LogicException(...);
return;
}
Требуется ли это, или не важно вернуться?
потому что я знаю, что после исключения исключений script останавливается, поэтому дальнейший код не запускается
Ответы
Ответ 1
недостижимый код
Я имею в виду обозначение ошибки в коде. Заявление недоступно. Каждый статический код anaylsis будет жаловаться на этот недостижимый оператор. Даже если в этом случае у вас нет вреда, при проверке кода вы получите массу предупреждений. Если вы отключите этот тип предупреждения, вы, возможно, пропустите другие логические ошибки в своем коде. Это настоящий плохой запах, и его нужно исправлять.
Ответ 2
Потому что они допустили ошибку, или это их личное предпочтение. Невозможно добраться до return
в этом коде, но нет никакого реального вреда в его включении.
Из документы (выделено мной):
Когда генерируется исключение, код, следующий за инструкцией, не будет выполнен, а PHP попытается найти первый соответствующий блок catch.
Ответ 3
Я предполагаю, что это просто для лучшей читаемости.... так что вы можете быстрее сканировать код для точек выхода, если вы притворяетесь, что каждая точка выхода разделяется новой строкой.
Ответ 4
Я нахожу это соглашение полезным, так как при попытке прочитать существующий код ранний выход может нарушить ожидания потока кода. и часто заслуживает того, чтобы быть обозначенным. Это почти гото.
Я читаю от внешних блоков до самых внутренних, а не последовательно, поэтому все, что скрывается внутри блока, на первый взгляд выглядит менее важным.
Сравнение:
function doStuff {
if (Y) {
##
## Stuff happens
##
}
else {
##
## Other Stuff happens
##
}
##
## So I assume this always happens
##
}
с
function doStuff {
if (Y) {
##
## Stuff happens
##
}
else {
##
## Other Stuff happens
return;
# ^- this is easy to spot when scanning
##
}
##
## This *usually* happens
##
}
Я предпочитаю последний, даже если он может быть немного лишним.
Я принимаю это в основном потому, что в 100 раз больше, чем "возвращение" в качестве важного ключевого слова, против количества раз, когда я должен ожидать исключения, но я могу обнаружить автономный "возврат"; (или "break;" или даже "продолжить" ) гораздо быстрее в экранах кода, чем я могу выбрать "throw new Exception (xxx, yyy)"; на расстоянии при быстрой прокрутке.
Если бы я работал над кодом, в котором обработка исключений была гораздо более частым методом управления потоком процессов, я мог бы с большей любовью узнать о "бросании" в качестве ключевого слова, но я не знаю.
Но тогда я также виноват в избыточном указателе, например:
function doStuff() {
if (X) {
## Do this
}
else {
## Do that
}
/* Should not get here. */
return NULL;
}
... но только в крайних случаях, когда вышеприведенная логика трудно следовать, например, когда ожидались ранние выходы.