如何调用在catch块中引发异常的方法?

时间:2019-02-15 01:49:13

标签: java exception-handling try-catch throws

我正在尝试拥有一种可以处理各种异常的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
}

我正在尝试提出一种更干净的方法来编写捕获块。

3 个答案:

答案 0 :(得分:4)

这是因为foo方法的catch块已经捕获到handleException上引发的异常。因此,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 :(得分:0)

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

(1)在这里,您可以按以下步骤解决此问题:

再次抛出异常。

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

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

throw handleException(e);

答案 2 :(得分:0)

  

在我的原始课程中,我有很多具有这种格式的方法...   我正在尝试提出一种更干净的方法来编写catch块。

我认为问题更多与了解应用程序中异常的处理方式有关;通常是设计问题。

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

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

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

这里有两个选项可供考虑:

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

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

是否由于业务逻辑问题而引发异常?如果是这样,您很可能会向用户显示一条消息或对该消息进行其他逻辑处理,并且/或者采取进一步措施从该消息中恢复-在业务规则允许的范围内。

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

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

注释(编辑添加)

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