当一个子方法抛出一个异常时,封装在专用的“包”异常中会被认为是不错的实践吗?通过组件抛出异常,良好实践?
public String doStuff() throws UtilsException {
try {
throw new NullPointerException("test");
} catch (NullPointerException e) {
throw new UtilsException("something occured", e);
}
}
//use this exception for all classes of this package/component
public class UtilsException extends Exception {
private static final long serialVersionUID = 1L;
public UtilsException() {
super();
}
public UtilsException(String message, Throwable cause) {
super(message, cause);
}
public UtilsException(String message) {
super(message);
}
public UtilsException(Throwable cause) {
super(cause);
}
}
可能Optional.empty()
是避免抛/复杂的应用程序的捕捉的方法吗?
public Optional<String> doStuff() throws UtilsException {
try {
return Optional.of("ok");
} catch (NullPointerException e) {
LOG.error("Something append... {}", e.getMessage());
return Optional.empty();
}
}
在某些设置中将低级异常包装为高级异常可能是一种很好的做法,但是如果您正在讨论'NullPointerException',则不是。你甚至不应该捕获一个'NullPointerException'。它在你的所有应用程序中具有相同的含义。一个'Optional'封装了一个可能缺少的值,而不是一个发生'NullPointerException'的报告。首先避免'NullPointerException'。你可以通过使用'Optional'来做到这一点。 – Holger
NullPointerException只是为了解释我的设置。遵循异常的来源,包装看起来很有趣。 –
然后你选择了一个非常糟糕的例子。考虑一下,一个'ClassNotFoundException'封装了加载类字节时发生的IOException。特殊情况是API层不允许检查异常,例如考虑数据库的“集合”视图。在那里,底层存储系统的故障必须被打包,例如,在'IllegalStateException's或'NoSuchElementException's中。我认为,这些都是更好的例子。 – Holger