良好的编程实践告诉你应该对调用者隐藏对象的内部状态,至少对我来说,这也包括异常。您应该看到该异常对您来说意味着什么,并向您的类的调用者返回一个表示该含义的异常。
如果框架已经提供了具有该含义的异常,例如 IllegalArgumentException,您应该实例化一个新对象,给它一个字符串,很好地描述发生的事情并封装发生的异常,类似于 new IllegalArgumentException("The argument X 无效,因为 ...", e); 如果框架对您的问题没有很好的描述性异常,您应该创建自己的一组异常。我通常为该项目/包创建一个通用异常(它将扩展 Exception 或 RuntimeException)并从中派生异常。例如,我最近创建了一个通用存储库项目,以便在我们的服务和应用程序模块中重用以访问数据库。因为我想从我用来访问数据库的东西中抽象出调用程序,即使是异常,我最终还是创建了一些异常来封装 JPA Hibernate 异常。我这里没有代码,但它类似于:
// implementation package
public abstract class GenericRepository<K, E extends<K>> implements IRepository<K, E>{
// constructors
public final void add(E entity){
// some code
try{
// code that can throw exceptions
} catch (EntityExistsException e) {
// some code
throw new EntityAlreadyExistsException(e);
} catch(RuntimeException e) {
// some code
throw new GenericRepositoryException("An unexpected exception occurred while manipulating the database", e);
}
}
// some other code
}
// exception package
public final class EntityAlreadyExistsException extends GenericRepositoryException{
public static final String GENERICMESSAGE = "The entity already exists on the table";
public EntityAlreadyExistsException(Throwable cause){
super(GENERICMESSAGE, cause);
}
// other constructors
}