Перебрасывание исключений через слои и использование кодов состояния - PullRequest
0 голосов
/ 27 ноября 2009

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

На php-сайте у меня есть PDO в качестве DAL, который используется объектами BLL, и они вызываются из пользовательского интерфейса. Теперь, если что-то происходит, PDO генерирует исключение PDOException. Конечно, слой пользовательского интерфейса не должен ничего знать об исключениях PDOException, поэтому объект BLL ловит его. Но что теперь?

Я прочитал это

  1. исключения для действительно исключительных ситуаций и
  2. каждый перебрасывает исключения из нижних уровней, чтобы не получать низкоуровневые исключения в верхних слоях.

Позвольте мне проиллюстрировать мою проблему (пожалуйста, не обращайте внимания на аргументы функции):

class User
{
 function signUp()
 {
  try
  {
   //executes a PDO query
   //returns a code/flag/string hinting the status of the sign up:
   //success, username taken, etc.
  }
  catch (PDOException $e)
  {
   //take the appropriate measure, e.g. a rollback

   //DataAccessException gets all the information (e.g. message, stack
   //trace) of PDOException, and maybe adds some other information too
   //if not, it is like a "conversion" from PDOException to DAE
   throw new DataAccessException();
  }
 }
}

//and in an upper layer
$user = new User();
try
{
 $status = $user->signUp();
 //display a message regarding the outcome of the operation
 //if it was technically successful
}
catch (DataAccessException $e)
{
 //a technical problem occurred
 //log it, and display a friendly error message
 //no other exception is thrown
}

Это правильное решение? При повторном отбрасывании PDOException я не думаю, что было бы целесообразно использовать цепочку исключений (так как это только сделало бы отладочную информацию избыточной; DataAccessException получает все, включая полную трассировку стека от PDOException).

Заранее спасибо.

1 Ответ

0 голосов
/ 28 ноября 2009

Как я понял твой пост хороший ресурс такой: Api design

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

SignUpException

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

...