alhames.ru
У меня тут возник вопрос общего характера..
Есть класс, реализующий какие-либо операции низкого уровня (например, PDO). При возникновении ошибки он кидает какой-либо свой exception.
Есть класс более высокого уровня (например, User), который использует внутри себя выше описанный класс. У этого класса тоже есть свои exceptions.
Вопрос: есть ли смысл перехватывать эксепшены низкоуровневого класса (PDOException) и кидать наружу уже экспешены более высокого уровня (UserException)?
Зачастую операции с низкоуровневым классом так или иначе приходится оборачивать в try-catch, т.к. в случае ошибки нужно выполнять какие-то дополнительные операции.
Т.е. это может выглядить примерно так:
Если честно мне не очень нравится эта конструкция. Причем это я описал 2-х уровневый каскад, а зачастую у меня их получается намного больше..
Как делаете вы и почему?
Есть класс, реализующий какие-либо операции низкого уровня (например, PDO). При возникновении ошибки он кидает какой-либо свой exception.
Есть класс более высокого уровня (например, User), который использует внутри себя выше описанный класс. У этого класса тоже есть свои exceptions.
Вопрос: есть ли смысл перехватывать эксепшены низкоуровневого класса (PDOException) и кидать наружу уже экспешены более высокого уровня (UserException)?
Зачастую операции с низкоуровневым классом так или иначе приходится оборачивать в try-catch, т.к. в случае ошибки нужно выполнять какие-то дополнительные операции.
Т.е. это может выглядить примерно так:
<?php
try
{
// запрос к базе с ошибкой
}
catch (PDOException $e)
{
// операции, выполняемые в случае ошибки
throw new UserException('описание ошибки');
}
Если честно мне не очень нравится эта конструкция. Причем это я описал 2-х уровневый каскад, а зачастую у меня их получается намного больше..
Как делаете вы и почему?
При это не теряется ни какая ценная информация об ошибке, но вызвавшему Ваш код передаётся осмысленное сообщение.
Вообще, каскадирование - хорошая вещь, кроме тех случаем, когда по определённым соображениям необходимо скрывать данные об ошибках нижних слоёв.
Например, есть UserEntity, UserPersistanceAdapter, UserCreateService, UserController. Контроллер использует сервис для выполнения задачи создания пользователя. Сервис использует какую-то реализацию адаптера, чтобы сохранить объект пользователя. Так как реализаций адаптера может быть много (PDO, mysql_, Mongo, etc.), то и вариантов исключений или (о, боже!) возвратов false из методов низкоуровневой библиотеки, тоже может быть много. Чтобы не ловить каждую разновидность исключения или возвращаемого значения, можно условиться о том, что реализация адаптера кидает исключение какого-то своего типа. И уже его ловить в контроллере. Таким образом, при изменении типа адаптера или добавлении нового, модификация внешнего ему кода не потребуется вовсе.
запомните простое правило: исключения должны вызываться только в исключительных ситуациях