处理服务层中的 Dao 异常
2022-09-01 16:57:10
如果我的 Dao 层抛出了特定于 Dao 的异常,那么在我的服务层中处理它们是否会导致问题泄漏?如果是,那么我应该使异常通用并独立于任何层来解决它,还是有其他方法?
同样的问题也适用于处理服务层引发的异常的 UI 层。
如果我的 Dao 层抛出了特定于 Dao 的异常,那么在我的服务层中处理它们是否会导致问题泄漏?如果是,那么我应该使异常通用并独立于任何层来解决它,还是有其他方法?
同样的问题也适用于处理服务层引发的异常的 UI 层。
当我们创建分层应用程序时,总是有一个用户层和另一个使用层。对于这种情况,UI 层 -> 使用服务层 ->使用 DAO 层。
现在它非常主观,可以解释。但目标应该是良好程度的脱钩。要做到这一点,一个出路是定义泛型层特定的例外说,等等。这些异常将包装实际层特定的异常。PersistentException
ServiceException
例如,如果数据库端存在一些错误(约束违规等),请将其包装在PersistentException中,并让服务层处理该错误(有关如何以通用方式将其传达给UI层)
现在,由于服务层和DAO层之间的集成是契约的(基于接口的),因此只要遵守接口契约,DAO层就可以自由地将实现更改为任何内容。因此,如果您更改了引发一些新异常的实现,则可以将这些新异常包装进去,并且服务层不受影响。PersistentException
是的。最好为每个层创建自己的独立例外。
例如,如果您使用的是特定的 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
}
因此,必须根据应用程序需求进行调用。