我有一个实现以下接口的基类,上面声明的方法抛出基本异常类型exception
。
有许多具体的类扩展了基类,我不想在所有这些类中添加try-catch
块。有没有一种方法可以处理抛出
而不添加尝试捕获
?
接口
public interface IReportFactory {
public Object GetDataFromDB(Connection conn,HashMap<String,String> map) throws Exception;
public Object GetJSONString(HashMap<String,String> map) throws Exception;
}
基层
public abstract class BaseReport implements IReportFactory{
public Connection conn;
public String acctId = FactoryReport.getAcctId();
------ I WANT TO CATCH EXCEPTION HERE ------
------ WHICH ACCURS IN OTHER CLASSES WHICH EXTENDS FROM THIS CLASSES -----
}
混凝土类示例(共30个)
public class GeneralRevenue extends BaseReport {
private final Logger logger = Logger.getLogger(GeneralRevenue.class);
public GeneralRevenue(Connection _conn) {
this.conn = _conn;
}
@Override
public Object GetJSONString(HashMap<String,String> params) throws Exception {
//codes
return jObj.toString();
}
@Override
public Object GetDataFromDB(Connection conn,HashMap params) throws Exception {
//codes
return RevenueList;
}
}
如果抛出RuntimeException,则无需添加抛出声明。例如,您创建自己的RuntimeException,比如
class NewException extends RuntimeException{
}
然后,当您向基类添加RuntimeException时,所有其他方法都不必声明调用这些方法的抛出。
http://docs.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html
你为什么不创建一个自定义的RuntimeException并把它扔到你的基类的try catch块里面呢?
public class GeneralRevenue extends BaseReport {
private final Logger logger = Logger.getLogger(GeneralRevenue.class);
public GeneralRevenue(Connection _conn) {
this.conn = _conn;
}
@Override
public Object GetJSONString(HashMap<String,String> params) throws MyException {
try{
//codes
}catch(Exception e) {
throw new MyException();
}
return jObj.toString();
}
}
class MyException extends RuntimeException {
}
仅仅因为您正在扩展接口并不意味着您必须添加抛出异常
,可以将您的实现类声明为抛出比接口更少的异常。你只是不能让实现抛出比接口更广泛的异常。
因此,您可以在没有throws子句的情况下定义您的方法,例如:
public Object GetJSONString(HashMap<String,String> params) {
如果有任何已检查的异常被抛出,您可以将其作为未检查的异常重新抛出。
如果你想捕捉子类抛出的异常,你必须重新安排你的代码,这样子类的方法就会被超类调用,否则超类就没有机会捕捉任何东西。您可能会考虑使用策略是否有意义(这会让您包装对策略的调用,并可能减少您必须执行的继承量)。
经常发生的事情是开发人员使用继承作为他们首选的扩展方式,并且(因为我们总是很匆忙)没有太多考虑将关注点分开,结果是代码复杂且不灵活。按照不同的职责将其分解可能有助于降低复杂性,并且可能有助于抛出异常的情况,因为不同的部分会更集中,并且可能抛出不那么广泛的异常。
当我在node中创建一个异步函数并使用await时,我正在使执行等待一个承诺解析(可以是一个解析或一个拒绝),我所做的是在try/catch块中放入一个await承诺,并在承诺拒绝的情况下抛出一个错误。问题是,当我在try/catch块内调用这个异步函数来捕获错误时,我会得到一个UnhandledPromiserEjectionWarning。但是使用await的全部意义并不是等待承诺解决并返回它
问题内容: 我需要一种从try / catch块的中间中断而又不会引发异常的方法。类似于中断并继续for循环的操作。这可能吗? 我对于抛出一个自定义异常(将其命名为“ BreakContinueException”)变得很奇怪,该异常在其catch处理程序中什么都不做。我敢肯定这很扭曲。 因此,我不知道任何直接的解决方案吗? 问题答案: 正确的方法可能是通过将try-catch块放在单独的方法中来
Scala没有检查异常。但是,当从java调用scala代码时,希望捕获scala抛出的异常。 斯卡拉: Java:
问题内容: 在Java中,我们使用try catch块处理异常。我知道我可以像下面这样编写一个try catch块来捕获方法中抛出的任何异常。 但是Java中有什么方法可以让我在发生异常时获取一种称为的特定方法,而不是像上面的方法那样编写一个包罗万象的方法? 具体来说,当抛出异常(我的应用程序逻辑未处理)时,我想在Swing应用程序中显示一条用户友好的消息。 谢谢。 问题答案: 默认情况下,JVM
问题内容: 我们知道捕获异常非常昂贵。但是,即使从不抛出异常,在Java中使用try-catch块是否也很昂贵? 问题答案: 几乎没有任何花销。代码的元数据不是在运行时进行设置,而是在编译时进行结构化,这样,当引发异常时,它现在执行相对昂贵的操作,即遍历堆栈并查看是否存在任何可捕获此异常的块。例外。从外行的角度来看,它可能也是自由的。它实际上是在抛出导致你付出代价的异常-但是,除非你抛出数百或数千
我有一个非常基本的函数,它搜索的数组列表,并返回与传递给它的参数匹配的帐户。但是,一旦抛出CustomerAccountNotFoundException,我的for循环就会中断。 我通过在异常后打印的值来测试这一点,该值一直被重置为0。如何在抛出异常后继续循环?我希望每次帐户不匹配时都抛出它,当它匹配时返回帐户。我还尝试过但不起作用。