Подтвердить что ты не робот

Почему некоторые люди возвращаются после того, как они выбрасывают Исключения?

Я вижу в некоторых из кода Github

if($something_funky_happens){
  throw new \LogicException(...);
  return;
}

Требуется ли это, или не важно вернуться? потому что я знаю, что после исключения исключений script останавливается, поэтому дальнейший код не запускается

4b9b3361

Ответ 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;
}

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