Я долго искал (и здесь), прочитал много php-кодов, но все еще не мог найти удовлетворительный ответ. Это может показаться слишком широкой темой, но это действительно слипается - наконец-то для меня. Не могли бы вы помочь?
На php-сайте у меня есть PDO в качестве DAL, который используется объектами BLL, и они вызываются из пользовательского интерфейса. Теперь, если что-то происходит, PDO генерирует исключение PDOException. Конечно, слой пользовательского интерфейса не должен ничего знать об исключениях PDOException, поэтому объект BLL ловит его. Но что теперь?
Я прочитал это
- исключения для действительно исключительных ситуаций и
- каждый перебрасывает исключения из нижних уровней, чтобы не получать низкоуровневые исключения в верхних слоях.
Позвольте мне проиллюстрировать мою проблему (пожалуйста, не обращайте внимания на аргументы функции):
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).
Заранее спасибо.