Разница между GOTO и THROW? - PullRequest
6 голосов
/ 25 июля 2010

Многие люди недавно обвиняли меня в том, что я упомянул только одно слово - "goto".
Меня удивляет, почему это считается таким противным словом.
Мне известно о нескольких предыдущих обсуждениях этой темы,но это не убеждает меня - s ome ответов просто говорит "это плохо", даже не пытаясь объяснить , а некоторые приводят причины, не относящиеся к языкам сценариев, таким как PHP, IMO .

В любом случае, я собираюсь задать очень конкретный вопрос:
Давайте сравним goto и throw заявления.
Оба, на мой взгляд, делают одно и то же: избегая выполнения некоторыхчасть кода, основанная на некотором условии.
Если это так - имеют ли throw те же недостатки, что и goto?(если есть)?
Если нет - то какая разница?

Кто-нибудь достаточно опытный, кто может сказать фундаментальную , концептуальную разницу между структурами кода двух следующих фрагментов кода?
Относительно этих самых фрагментов кода, а не "в теории" или "в общем "или" вот хороший комикс XKCD! ".
Почему первый считается блестящим, а второй - самым смертельным из грехов?

#$a=1;
#$b=2;

/* SNIPPET #1 */

try {
    if (!isset($a)) {
      throw new Exception('$a is not set');
    }
    if (!isset($b)) {
      throw new Exception('$b is not set');
    }
    echo '$a + $b = '.($a + $b)."<br>\n";
} catch (Exception $e) {
    echo 'Caught exception: ', $e->getMessage(), "<br>\n";
}

/* SNIPPET #2 */

if (!isset($a)) { 
  $message = '$a is not set';
  goto end;
}
if (!isset($b)) {
  $message = '$b is not set';
  goto end;
}
echo '$a + $b = '.($a + $b)."<br>\n";

end:
if (!empty($message)) {
  echo 'Caught exception: ', $message, "<br>\n";
}

Обратите внимание, что мне известен тот факт, что бросок более силен и гибок в приготовлении спагетти .Это не имеет принципиального значения для меня.Это вопрос использования, а не концепции.

РЕДАКТИРОВАТЬ
Многие люди говорили мне, что первый пример должен быть более новым.
Причина: следует использовать исключенияобрабатывать только ошибки, а не реализовывать бизнес-логику.
Это выглядит разумно.

Таким образом, единственный способ остановить бесполезное выполнение кода - это перейти к (не говоря уже о некоторых подстановках, таких как while, return и т. д.), что такое же дело, но сложнее реализовать)?

Ответы [ 11 ]

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

Не используйте тоже.Используйте "while (1)" вокруг основной части вашего кода и операторы "break", где вы хотите перейти к концу.

while(1)
{
    if (!isset($a)) { 
      $message = '$a is not set';
      break;
    }
    if (!isset($b)) {
      $message = '$b is not set';
      break;
    }

    echo '$a + $b = '.($a + $b)."<br>\n";
    break;
}

if (!empty($message)) {
  echo 'Caught exception: ', $message, "<br>\n";
}
...