2015-04-15 20 views
0

我想捕获一个SQLException,发送一些邮件然后发送异常到下一个目标。我子类如下:java:重新抛出被困异常

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

     ... send mail ... 

     throw new SQLException(cause); 
    } 
} 

如果我裹着现有函数抛出的SQLException(“连接()”或者是之流):

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

可我重新抛出原SQLException或者我需要解压缩并创建一个新的? IE浏览器是我的类去生成运行时错误,当我打电话抛出新的SQLException(原因);

回答

4

有一个更清洁的方式做你正在尝试的事情。

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

    throw e; 
} 

你不需要子类SQLException

+0

优秀点。事后看来,这是更安全的。 (得到橡皮擦) - 开始(de)编码的时间。 – ethrbunny

1

我不明白为什么它是不可能的,但你需要抓住的SQLException:

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

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

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

实际的框架本身应该用来做到这一点。例如,如果您要管理所有软件组件(例如spring的控制反转(IoC)容器),并且每次发生特定的异常(例如发送电子邮件)时都要执行“某些事情”被抛出,你可以使用Aspect Orientated Programming技术。

使用这样的声明式构造,您可以针对某些方法并拦截引发SQLException的情况,然后执行您的逻辑。

在发送电子邮件的情况下,我会亲自创建队列或东西,所以我的主要代码执行不举起,同时电子邮件被发送