PHP: Исключения против пользовательских ошибок

#php #exception #exception-handling

#php #исключение

Вопрос:

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

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

 // 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. Какой подход вы бы предложили?

Комментарии:

1. Находится ли этот код (в частности, echo) в вашем шаблоне вывода? — Исключения, конечно, не применимы «ко всему». Их использование для передачи сообщений конечному пользователю практически выполнимо (специальный класс исключений), но в идеале пользовательские уведомления должны использовать отдельную систему, обрабатываемую приложением, а не средой выполнения.

Ответ №1:

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

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

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

Ответ №2:

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

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

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

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

Ответ №3:

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

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