什么是Java中的异常包装?

Rah*_*rya 10 java exception

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

Nee*_*ain 10

Exception wrapping 当您捕获异常时,将其包装在另一个异常中并抛出该异常.

这是一个例子:

 try{
       dao.readPerson();
 } catch (SQLException sqlException) {
       throw new MyException("error text", sqlException);
 }
Run Code Online (Sandbox Code Playgroud)

资料来源:http://tutorials.jenkov.com/java-exception-handling/exception-wrapping.html

另一方面

Exception Propagation:首先从堆栈顶部抛出异常,如果没有捕获,它会将调用堆栈下拉到前一个方法,如果没有捕获,则异常再次下降到前一个方法,依此类推,直到它们为止被抓住或直到他们到达调用堆栈的最底部.

资料来源:http://www.javatpoint.com/exception-propagation

  • @BoratSagdiyev 感谢您的反对,我不知道您在这个答案中发现了什么错误,迫使您单击该按钮。如果您有一些疑问,您可以要求发表评论,而不是挑战我所知道的和我不知道的.........并且我看到您正在对这里复制的每个答案进行评论那里......OP来到这里,因为他无法在其他地方找到正确的答案。如果有人提供答案,那不会伤害任何人...... (2认同)

Ken*_*iri 5

我认为Neeraj的答案是正确的。作为补充,我认为一个特别好的案例是通过抽象异常来管理抛出的异常数量。为了扩展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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这样,客户端只需要执行以下操作:

try {
    manager.sendPerson();
} catch (ManagerException e) {
    // Handle fail by manager
}
Run Code Online (Sandbox Code Playgroud)

而不用担心管理器中可能出问题的详细信息。


wvd*_*vdz 2

一个用例是将受检查的异常转换为运行时异常,反之亦然。

或者它可能只是一个命名的东西。假设您SQLException在代码中的某个时刻捕获了 an ,但您可以推断这是因为用户未登录。然后您可以捕获它并抛出您自己的自定义NotLoggedInException.