У меня тут возник вопрос общего характера..
Есть класс, реализующий какие-либо операции низкого уровня (например, PDO). При возникновении ошибки он кидает какой-либо свой exception.
Есть класс более высокого уровня (например, User), который использует внутри себя выше описанный класс. У этого класса тоже есть свои exceptions.
Вопрос: есть ли смысл перехватывать эксепшены низкоуровневого класса (PDOException) и кидать наружу уже экспешены более высокого уровня (UserException)?
Все это может выглядеть например так:
<?php
class User
{
function doSomething()
{
try
{
// запрос к базе с ошибкой
}
catch (PDOException $e)
{
// операции, выполняемые в случае ошибки
throw new UserException('описание ошибки');
}
}
}
Зачастую операции с низкоуровневым классом так или иначе приходится оборачивать в try-catch, т.к. в случае ошибки нужно выполнять какие-то дополнительные операции.
Причем используя класс, построенный таким образом, мы заранее знаем какой именно exeption он может вернуть (например, класс User возвращает только UserException, и никогда не вернет PDOException).
Но есть и недостатки - в итоге мы получаем очень много последовательно выполняющихся блоков try-catch, когда можно было сделать один try снаружи и много блоков catch для каждого типа эксепшенов (если это необходимо). К тому же помимо PDOExeption может произойти ErrorExeption..
И еще момент - передача информации об ошибке пользователю. Допустим User::getUserByEmail('abc') вернет нам UserException "Email is not valid" - как лучше его обработать, чтобы выдать пользователю понятную информацию об ошибке? Хранить массив соответствий errorCode => errorMessage, где errorMessage - понятное описание ошибки на русском языке?
Интересует как вы решаете подобные вопросы и почему именно так?