如何调用在catch块中抛出异常的方法?

问题描述 投票:1回答:3

我想要一个可以处理各种异常的HandleException方法。

问题是,我的函数返回一个值。但是如果我在catch块中使用HandleException,Java会抱怨该函数不会返回值,即使我的HandleException总是抛出异常。

解决这个问题的好方法是什么?谢谢!

这是一个示例代码。

public class MyException {

    static int foo(int num) throws Exception {
        try {
            return bar(num);
        } catch (Exception e) {
            handleException(); 
        //    throw new Exception("Exception in foo", e);
        }
    }

    static int bar(int num) throws IllegalArgumentException {
        if (num < 0) {
            throw new IllegalArgumentException("Num less than 0");
        }
        return num;
    }

    static void handleException(Exception e) throws Exception {
        System.err.println("Handling Exception: " + e);
        throw new Exception(e);
    }

    public static void main(String[] args) throws Exception {
        int value = foo(-1);
    }
}

在我的原始课程中,我有很多具有这种格式的方法。

try {
    ...
} catch (Exception1) {
    Log exception
    throw appropriate exception
} catch (Exception2) {
    Log exception
    throw appropriate exception
}

我试图想出一个更清晰的方法来编写catch块。

java exception-handling try-catch throws
3个回答
4
投票

这是因为在handleException上抛出的异常已被foo方法的catch块捕获。因此,foo方法不再抛出异常,使得catch块不返回任何内容。因此,如果bar方法抛出异常,它将转到catch块,但由于catch块没有返回任何内容,Java会在catch块之后执行这些行,但是当它到达结尾时,它会抛出一个错误“该方法必须返回一个int类型的结果“因为你没有return语句。

你应该改变这一部分。

public class MyException {

    static int foo(int num) throws Exception {
        try {
            return bar(num);
        } catch (Exception e) {
            throw handleException(e); // this will throw the exception from the handleException
        //    throw new Exception("Exception in foo", e);
        }
    }

    static int bar(int num) throws IllegalArgumentException {
        if (num < 0) {
            throw new IllegalArgumentException("Num less than 0");
        }
        return num;
    }

    // This method now returns an exception, instead of throwing an exception
    static Exception handleException(Exception e) {
        System.err.println("Handling Exception: " + e);
        return new Exception(e);
    }

    public static void main(String[] args) throws Exception {
        int value = foo(-1);
    }
}

1
投票

在我的原始类中,我有很多具有这种格式的方法......我试图想出一种更清晰的方法来编写catch块。

我认为问题更多的是理解如何在应用程序中处理异常;一般来说,它是一个设计问题。

考虑一下方法:int foo(int num) throws Exception

方法foo返回一个值,捕获异常/句柄并抛出异常。考虑这些方面。

如果方法正常运行,没有错误,则返回一个值。否则,如果其逻辑存在问题,则在方法中抛出异常,捕获它并在方法的catch块中处理它。该方法也会引发异常。

这里有两个选择:

  1. 重新抛出异常,例如自定义业务/应用程序异常(只记录并重新抛出相同或自定义异常),这需要在其他地方处理 - 即在堆栈中的调用方法中。
  2. 处理异常:这意味着该方法负责处理异常。某些业务/应用程序逻辑在异常处理中发生。并且,该方法返回一个值。

抛出异常的方法的目的是在其他地方处理它,就像在调用方法中一样。处理可以像从异常问题中恢复或显示消息或中止事务或业务逻辑定义的任何内容。

是否因为业务逻辑问题而抛出异常?如果是这样,很可能您向用户显示消息或对其执行其他逻辑和/或采取进一步措施从中恢复 - 正如业务规则允许的那样。

如果由于应用程序逻辑无法恢复的情况而抛出异常,请执行适当的操作。

最终,您必须明确要求抛出异常的原因,抛出异常以及如何在应用程序中处理异常。应用程序/逻辑/规则要求会影响代码中的异常处理。

备注(编辑添加):

  • 有很多文章在网上解释业务应用程序中的异常处理。可以尝试像“Java例外最佳实践”这样的搜索字符串。这是一篇这样的文章,它有一些有用的信息:Effective Java Exceptions
  • 还有try-catch-finally构造要考虑(以及Java 7引入的各种新的exception features)。

1
投票

foo方法的返回类型是inthandleException的返回类型是void,这就是编译器给出错误的原因。

(1)在这里你可以解决这个问题如下:

再次抛出异常。

try{
      return bar(num);
}
catch(Exception e){
      handleException(e);
      throw e;
}

(2)此外,如果你想抛出新创建的异常,那么将handleException的返回类型更改为Exception。使用

throw handleException(e);
© www.soinside.com 2019 - 2024. All rights reserved.