PHP: исключения против пользовательских ошибок - PullRequest
2 голосов
/ 09 мая 2011

Сегодня я хорошо поболтал с моим другом. Мы рассмотрели несколько аспектов веб-разработки.

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

// My little function
function check_user_perms($user)
{
    // @returns boolean
    // checking is user is permitted to perform an action
    return ($something > 1) ? TRUE : FALSE; // of course it returns true/false, not null
}

// place where I need to check user permission
// please note that following lame snippets are meant to show you my approach
if( check_user_perms($user_id) )
{
    // perform the action
}
else
{
    echo 'You have no permission to perform this action.';
}

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

Есть только несколько вещей, которые требуют уточнения:
1. Должен ли я использовать исключения для всего в веб-приложении?
2. Если да, то как показать сообщение пользователю на производстве?
3. Какой подход вы бы предложили?

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

Исключения следует использовать для «исключительных ситуаций». Проверка наличия у пользователя надлежащих разрешений не является «исключительной ситуацией». Это очень распространенная проверка, которая не должна использовать исключение. Возвращение true/false здесь нормально.

Если, с другой стороны, при проверке, имеет ли пользователь доступ, возникает «исключительная» ошибка, такая как невозможность проверить сервер аутентификации из-за его неработоспособности, тогда было бы целесообразно создать исключение.

Вот еще несколько ресурсов для проверки:

1 голос
/ 09 мая 2011

check_user_perms должно возвращать TRUE или FALSE (не NULL!).

Исключения составляют исключительные обстоятельства , а не общее управление потоком программ.

Примером может быть:

  • Если у пользователя есть разрешение на это действие, вернуть TRUE
  • Если у пользователя нет прав на выполнение этого действия, вернуть FALSE
  • Если пользователь не существует, выведите исключение (поскольку мы ожидали, что пользователь будет существовать, если эта функция была вызвана в первую очередь).
0 голосов
/ 09 мая 2011

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

В качестве обобщения я бы сказал, что код, который определяет, имеет ли пользователь конкретное разрешение,не выбрасывайте исключение, а скорее верните true или false.Код, вызывающий этот вызов, может, в зависимости от контекста, выбрать исключение, если разрешение требуется и ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...