Java中的异常包装是什么?如何在异常处理中有用?它与异常传播有何不同?
答案 0 :(得分:8)
Exception wrapping
是当你捕获异常时,将其包装起来 在另一个异常中抛出异常。以下是一个例子:
try{ dao.readPerson(); } catch (SQLException sqlException) { throw new MyException("error text", sqlException); }
来源:http://tutorials.jenkov.com/java-exception-handling/exception-wrapping.html
另一方面
Exception Propagation
:首先从顶部抛出异常 堆栈,如果它没有被捕获,它将调用堆栈下拉到 以前的方法,如果没有在那里捕获,异常再次下降到 以前的方法,依此类推,直到它们被捕获或直到它们为止 到达调用堆栈的最底层。
答案 1 :(得分:4)
我认为Neeraj's answer是现货。为了补充它,我认为一个特别好的情况是管理抽象异常引发的异常数量。扩展Neeraj的例子:
class Manager {
public void sendPerson() throws ManagerException {
try{
Person person = dao.readPerson();
Socket socket = getSocket();
OutputStream os = socket.getOutputStream();
String personJson = objectMapper.writeValueAs(person);
os.write(personJson);
} catch (SQLException | SocketException | OutputStreamException | SerializationException e) {
throw new ManagerException("error text", e);
}
}
}
这样,客户端只需要执行以下操作:
try {
manager.sendPerson();
} catch (ManagerException e) {
// Handle fail by manager
}
而不是担心经理可能出错的细粒度细节。
答案 2 :(得分:1)
用例是将已检查的异常转换为运行时异常,反之亦然。
或者它可能只是一个命名的事情。我们假设您在代码中的某个位置捕获SQLException
,但您可以推断它是因为用户未登录。然后您可以捕获它并抛出您自己的自定义{ {1}}。
答案 3 :(得分:0)
这个答案来自这里:http://www.javapractices.com/topic/TopicAction.do?Id=77
数据可以以各种方式存储,例如: 关系数据库 文本文件 在网络上(例如,从网站上获取天气预报) 如果存储方法更改,则数据访问层抛出的低级别Exception对象也可以更改。例如,当数据存储从文本文件移动到关系数据库时,IOException将替换为SQLException。 为了防止这种变化传播到更高层,可以将这种低级别异常包含在通用的“数据异常”中。包装纸,专门用于保护较高层免受此类变化。
现在我们将看到一个例子......
public class ResourceLoader {
public loadResource(String resourceName) throws ResourceLoadException {
Resource r;
try {
r = loadResourceFromDB(resourceName);
}
catch (SQLException e) {
throw new ResourceLoadException("SQL Exception loading resource "
+ resourceName: " + e.toString());
}
}
}
loadResource的实现合理地使用了异常。通过抛出ResourceLoadException而不是SQLException(或实现抛出的任何其他异常),loadResource隐藏了调用者的实现,使得更改实现更容易,而无需修改调用代码。此外,loadResource()抛出的异常 - ResourceLoadException - 直接与它执行的任务相关:加载资源。低级别异常SQLException和IOException不直接与此方法执行的任务相关,因此可能对调用者没那么有用。此外,此包装保留原始异常的错误消息,以便用户知道资源无法加载的原因(可能是因为连接错误或用户名或密码不正确),并且可以采取纠正措施。