当前位置: 首页 > 知识库问答 >
问题:

如何在不使用try-catch块的情况下捕获“抛出异常”?

范彭亮
2023-03-14

我有一个实现以下接口的基类,上面声明的方法抛出基本异常类型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;
    }
}

共有3个答案

蒋寒
2023-03-14

如果抛出RuntimeException,则无需添加抛出声明。例如,您创建自己的RuntimeException,比如

 class NewException extends RuntimeException{

  }

然后,当您向基类添加RuntimeException时,所有其他方法都不必声明调用这些方法的抛出。

http://docs.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html

柳均
2023-03-14

你为什么不创建一个自定义的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 {
}
匡安宜
2023-03-14

仅仅因为您正在扩展接口并不意味着您必须添加抛出异常,可以将您的实现类声明为抛出比接口更少的异常。你只是不能让实现抛出比接口更广泛的异常。

因此,您可以在没有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。如何在抛出异常后继续循环?我希望每次帐户不匹配时都抛出它,当它匹配时返回帐户。我还尝试过但不起作用。