Да. Хорошая идея - создавать свои собственные независимые исключения для каждого слоя.
Например, если вы используете конкретную реализацию DAO, вам следует связать исключение, специфичное для реализации, с вашим собственным универсальным исключением и выбросить его на уровень обслуживания.
Тем не менее, вы должны быть внимательны при создании собственной иерархии исключений, чтобы она не накладывала затрат на разработку приложений, а также позволяла поддерживать информацию, требуемую на уровне обслуживания. В большинстве случаев для этого достаточно пользовательских кодов ошибок с общим исключением.
Нечто подобное можно использовать для имитации исключения, связанного с реализацией, и выбросить его на сервисный уровень.
class AppDAOException extends Exception {
public final static int _FAIL_TO_INSERT = 1;
public final static int _UPDATE_FAILED = 2;
public final static int _SQL_ERROR = 3;
private int errorCode;
public AppDAOException(int errorCode) {
this.errorCode = errorCode;
}
public getErrorCode() {
return errorCode;
}
}
Бросок от реализации DAO:
try {
//code here
} catch (some.impl.SQLSyntaxException e) {
throw new AppDAOException (AppDAOException._SQL_ERROR );
}
Об утечке концерна:
Возможно, вы не захотите, чтобы уровень обслуживания беспокоился обо всех исключениях, таких как:
} catch(NoRowExistsException e) {
return null;
} finally {
//release resources
}
Таким образом, вызов должен приниматься в зависимости от потребностей приложения.