Правильное использование die ()? - PullRequest
2 голосов
/ 14 июня 2010

Примечание: Я использую буферизацию вывода.Он просто упакован в функции head () и foot ().

Я создаю страницы в моем текущем проекте PHP, используя следующий шаблон:

<?php
include 'bootstrap.php';
head();
?>

<!-- Page content here -->

<?php
foot();
?>

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

<?php
include 'bootstrap.php';
head();

try
{
    //Simulate throwing an exception from some class
    throw new Exception('Something went wrong!');
}
catch(Exception $e)
{
    ?>
    <p>Please fix the following error:</p>
    <p><?php echo $e->getMessage(); ?></p>
    <?php
    foot();
    die();
}

//If no exception is thrown above, continue script
doSomething();
doSomeOtherThing();

foot();
?>

По сути, у меня есть скрипт с несколькими задачами на нем, и я пытаюсь настроить изящный способ уведомить пользователя оошибки ввода при предотвращении выполнения оставшейся части скрипта.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 14 июня 2010

Я бы сделал это:

head();
try {
    somethingPossiblyWithError();
    somethingElse();
} catch (Exception $e) {
    handleError();
}
foot();

Смерти не требуется. Если в somethingPossiblyWithError возникает ошибка, то somethingElse будет пропущено. foot будет выполнено в обоих случаях.

ОБНОВЛЕНИЕ: Я проголосовал за ответ полковника Шрапнеля, так как, я думаю, вы не думали об этом, и это ценный кусок знания. В PHP вы можете получить эквивалентную функциональность путем буферизации вывода , без явной передачи значений, но это не так красиво - однако, это работает, если вы вызываете функции, которые будут печатать вещи, а не возвращать их как значения так что иногда полезно знать.

3 голосов
/ 14 июня 2010

Вся структура страницы неверна.
Хотя это самая распространенная ошибка новичка.

Никогда не нужно выводить что-либо до того, как все данные будут готовы.
Ваш скрипт может отправлять некоторые заголовки HTTP, может устанавливать некоторые переменные для использования в header () или что-то в этом роде.

Следовательно, использование шаблона необходимо.
Вы должны разделить ваш сценарий на 2 части - получение части данных и отображение части данных.
Итак, вы должны переместить функцию header () намного ниже.
И на основеответ Amadan это может быть

<?php
include 'bootstrap.php';
try {
  getData();
} catch (Exception $e) {
    handleError();
}
head();
body();
foot();
?>

Функция handleError () может установить соответствующий код ошибки HTTP (404 или 500) и заменить шаблон тела текстом сообщения об ошибке.

1 голос
/ 14 июня 2010

Ваш подход не рекомендуется по многим причинам.Вы должны:

  • разделить представление и логику (взгляните на шаблон MVC)
  • избежать процедурного кода, написать объектно-ориентированный PHP
  • отдельный пользователь и администраторопыт (аккуратно обрабатывать ошибки)

Пример, реализующий выше:

<? $page->debug = true; ?>
<?= $page->getHead(); ?>
<?= $page->getBody(); ?>
<?= $page->getFoot(); ?>

class page {

   public debug;

   public function getBody() {
       try {
          //
       } catch (Exception $e) {
          $this->_errorhandler('message');
       }
   }

   protected function _errorhandler($message) {
        if ($this->debug) {
              // display error message
          } else {
             // display nothing, log the error
             // or throw concrete exception
             // or redirect
          }
   }
 ...
}

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

...