繁体   English   中英

Java如何“覆盖”捕获块

[英]Java How to “Override” a catch block

我有办法 此方法有一个catch块。

// pseudo code
private void function() {
    try {
        // something
    } catch(exception e) {
        // error handling
    }
}

在另一类中调用此方法。在一种情况下,该类使用其自己的catch块实现。

// pseudo code
private void anotherFunction() {
    try {
        function(); 
    } catch {
        //another catch block
    }

现在,我只想在调用该函数的catch块中执行代码,而不要调用该类中实现的catch块。 有没有办法做到这一点,或者我应该考虑另一种方法吗?

一种解决方法是将您的逻辑移至另一种不处理该异常的方法,而只是将其向上传递,例如:

public void unsafeFunction() throws Exception{
    // something
}

然后从两个类中调用该方法,这两个类对异常的处理方式不同:

public void function(){
    try {
        unsafeFunction();
    } catch(Exception e){
        // error handling
    }
}

和:

public void anotherFunction(){
    try {
        unsafeFunction();
    } catch(Exception e){
        // other error handling
    }
}

这样一来,您就可以将调用者的例外情况留给调用者。


另一种完全不同的方法是使用Java 8中的java.util.function.Consumer接口并接受您的function ,然后调用者可以将错误处理程序传递给它:

public void function(Consumer<? super Exception> errorHandler){
    try{
        // something
    } catch(Exception e){
        // delegate to handler
        errorHandler.accept(e);
    }
}

然后可以这样使用:

public void someFunction(){
    function(e -> {
        // error handling
    });
}

和:

public void anotherFunction(){
    function(e -> {
        // other error handling
    });
}

一定有理由捕获异常。 说原因可以用另一种方法进行测试:

private boolean testCircumstanceThrowingException() {
    if (exceptionalCircumstance) {
        return false;
    } else {
        return true;
    }
}

那么您可以将原始功能实现为:

private void functionCatchingException(){
    if (testCircumstanceThrowingException()) {
        //error handling
    }

    function();
}

private void anotherFunction() {
    if (testCircumstanceThrowingException()) {
        //error handling
    }

    function();
}

这样,在应用程序正常运行期间,不会引发任何异常。 这是应该的,因为例外是针对特殊情况的 如果您以某种方式进入了预期会出现异常的状态,则说明出现了问题。

如果没有其他方法,则应仅依靠竞争。 例如,如果您对function特定使用无法测试异常情况,则需要使用function 查看Lino的答案,以了解可能的解决方法。


Java纯粹主义者会注意到,您可以简单地return exceptionalCircumstance; 但是此代码只是为了表明可能需要测试异常情况的函数; 结果甚至可能不是布尔值。

当然,您现在可能想要重命名functionCatchingException :)

在您的第一个代码段中:

private void function() {
    try {
        // something
    }
    catch (Exception e) {
        // error handling
        throw e; // rethrow?
    }
}

Java基本上有两种选择。 您可以吞下该异常,也可以将其重新抛出。 如果吞下它,则此方法的调用者将不会看到异常。 如果您重新抛出,则调用方也将获得异常。

如果这些行为都不是您真正想要的,那么您可能需要重新考虑您的设计。

您可以使用关键字throw将异常抛出给调用方方法:

private void function(){
    try{
       //something
    } catch(Exception e){
       //error handling
       throw e;
    }
}

然后您的anotherFunction() catch块将被执行。

您可以从这里了解更多信息: Java教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM