Как изящно умереть? - PullRequest
       16

Как изящно умереть?

5 голосов
/ 24 марта 2011

Итак, я только что прочитал Почему никогда не использовать 'или умереть'.

Я запутался больше, чем когда-либо.Я проверяю сложную форму и прохожу через множество вложенных уровней операторов if, а что нет, и я передаю переменную в форму, которая называется $ status, которая может быть только «новой» или «редактировать».Затем, когда пользователь отправляет форму для повторной проверки, форма передает значение $ status в виде скрытого поля ($ _POST).Я хочу убедиться, что пользователь не может случайно изменить это, поэтому я хочу уловить ошибку, если что-то иное, чем «новый» или «редактировать», пройдет.(Хотя я хотел бы полностью исключить возможность влияния пользователя на эту переменную в идеальном мире.)

Поэтому я решил, что я бы использовал DIE () в операторе if

<nested ifs>
    Select ($status){
        Case 'edit':
            break;
        Case 'new':
            break;
        default:
            //using example from article
            trigger_error("An error that should not occur has occurred", E_USER_ERROR);
            break;
    }
</nested ifs>

Я не очень понимаю, как это чище, чем умереть ()?По сути, я хотел бы вызвать другую функцию, которая отображает пользователю некоторые возможности того, что они могут сделать на данном этапе, чтобы исправить ошибку, но я хочу, чтобы код полностью прекратил работать, так как я не хочу, чтобы оператор if продолжал синтаксический анализ.что-нибудь и генерирует ошибку, когда он находит что-то кроме «new» или «edit».

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

Ответы [ 2 ]

6 голосов
/ 24 марта 2011

trigger_error() вызывает ошибку, которая обрабатывается обработчиком ошибок.

С помощью trigger_error() вы можете корректно обрабатывать ошибки, например:

<code>  set_error_handler('ErrorHandler');

  function ErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
  {
    print '<pre style="line-height: 2em;">';
    printf("==> Error in `%s' line %s: %s\n\n", $filename, $linenum, $errmsg);
    debug_print_backtrace();
    print '
';выход ($ ERRNO);}

Это простой пример, но веб-сайт нашей компании отображает дружественную страницу с ошибкой и отправляет мне электронное письмо, что я идиот и где-то напутал: -)

преимущество перед die() или exit() должно быть ясно: -)

exit() все еще можно использовать, когда вам нужно выйти.Например, когда вы генерируете шаблон, выведите его и хотите, чтобы выполнение кода было остановлено.Или когда вы отправляете заголовок header('Location: ...'); и хотите убедиться, что выполнение остановлено ... Просто не используйте его для обработки непредвиденных ситуаций (например, ошибок).

trigger_error() также дает вам лучшую степеньконтроля.Вы можете отправить E_USER_NOTICE, если вы хотите, чтобы выполнение остановилось, но при этом отображалось уведомление, и E_USER_ERROR, если вы хотите, чтобы выполнение stop .

. Кроме того, вы можете написать более сложный обработчик ошибок.функции, в которых некоторые IP-адреса видят ошибку, а остальные - нет ... Kindda полезна для разработки.

Будьте осторожны с чрезмерно сложными обработчиками ошибок, однако, что происходит, если ошибка возникает внутри обработчика ошибок ...?Возможно, вы видели Начало:)

1 голос
/ 24 марта 2011

В статье, на которую вы ссылаетесь, объясняется, почему вы не должны использовать or die, например:

$result = mysql_query($query) or die('A MySQL query occurred: ' . mysql_error());

Очевидно, это плохая идея, поскольку она может выдавать злонамеренную информацию о вашей структуре MySQL злоумышленнику.

Тем не менее, я думаю, что нет ничего плохого (и я думаю, что автор статьи согласился бы со мной) использовать die так, как вы его используете, хотя предоставление пользователю списка опций действительно , быть предпочтительным способом справиться с этим.

...