java:rethrowing trapped exception

时间:2015-04-15 19:31:21

标签: java exception-handling

我想捕获 SQLException ,发送一些邮件,然后将异常发送到下一个目标。我的子类如下:

class myexception extends SQLException {
    public myexception( Throwable cause ) throws SQLException {
        super( cause );

        ... send mail ...

        throw new SQLException( cause );
    }
}

如果我已经包装了一个抛出SQLException的现有函数(' connect()'或者它):

public void somecall() throws myexception {
   try {
      ... SQL call ...
   } catch( SQLException sqlException ) {
       throw new myexception( sqlException );
   }
}

我可以重新抛出原始的SQLException,还是需要解压缩并创建一个新的? IE当我调用抛出新的SQLException(原因)时,我的类会产生运行时错误;

3 个答案:

答案 0 :(得分:4)

有一种更清洁的方法来做你正在尝试的事情。

try {
    sqlCall();
} catch (SQLExcetion e) {
    sendMail();

    throw e;
}

您不需要继承SQLException

答案 1 :(得分:1)

我不明白为什么不可能,但你需要捕获SQLException:

try{
    try{
        someCall();
    }
    catch(myException e) {

    }
}
catch(SQLException e) {
    // catches the thrown SQLException 
    //created by new myException(Throwable clause)
}

答案 2 :(得分:1)

在我看来,不应该使用例外来实现业务或框架逻辑(例如“在创建时发送电子邮件”)

实际框架本身应该用来做到这一点。

例如,如果您正在管理Inversion of Control(IoC)容器(如spring)中的所有软件组件,并且每次特定异常时都希望执行“某些操作”(例如发送电子邮件)抛出,您可以使用面向方面编程技术。

使用这样的声明性构造,您可以定位某些方法并拦截抛出SQLException的情况,然后执行您的逻辑。

在发送电子邮件的情况下,我会亲自创建一个队列或其他东西,以便在发送电子邮件时不会执行我的主要代码