什么是Java中的异常包装?

时间:2015-03-10 19:53:24

标签: java exception

Java中的异常包装是什么?如何在异常处理中有用?它与异常传播有何不同?

4 个答案:

答案 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:首先从顶部抛出异常   堆栈,如果它没有被捕获,它将调用堆栈下拉到   以前的方法,如果没有在那里捕获,异常再次下降到   以前的方法,依此类推,直到它们被捕获或直到它们为止   到达调用堆栈的最底层。

来源:http://www.javatpoint.com/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不直接与此方法执行的任务相关,因此可能对调用者没那么有用。此外,此包装保留原始异常的错误消息,以便用户知道资源无法加载的原因(可能是因为连接错误或用户名或密码不正确),并且可以采取纠正措施。