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

How to call a method that throws an exception in catch block?

我正在尝试使用 HandleException 方法来处理各种异常。

问题是,我的函数 return 是一个值。但是,如果我在我的 catch 块中使用 HandleException,Java 会抱怨该函数没有 return 值,即使我的 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);
    }
}

在我原来的 class 中,我有很多方法都是这种格式。

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

我正在尝试想出一种更简洁的方式来编写 catch 块。

这是因为在 handleException 上抛出的异常已经被 foo 方法的 catch 块捕获。因此 foo 方法不再抛出 Exception 使 catch 块 return 什么都没有。因此,如果 bar 方法抛出异常,它将转到 catch 块,但由于 catch 块不是 returning 任何内容,Java 执行 catch 块之后的行,但当它到达末尾时抛出"the method must return a result of type 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);
    }
}

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

(1) 这里可以这样解决:

再次抛出异常。

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

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

throw handleException(e);

In my original class, I have lot of methods that have this format... I am trying to come up with a cleaner way to write the catch blocks.

我认为这个问题更多地与了解应用程序中如何处理异常有关;一般来说,这是一个设计问题。

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

方法 foo returns 一个值,捕获一个 exception/handles 并抛出异常。考虑这些方面。

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

这里有两个选项需要考虑:

  1. 重新抛出异常,如自定义 business/application 异常(只需记录并重新抛出相同或自定义异常),需要在其他地方处理 - 即在调用方法中堆栈。
  2. 处理异常:这意味着该方法会处理异常。一些 business/application 逻辑发生在异常处理中。并且,方法returns一个值。

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

是否因为业务逻辑问题抛出异常?如果是这样,您可能会向用户显示一条消息或对其执行一些其他逻辑 and/take 从中恢复的进一步步骤 - 在业务规则允许的情况下。

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

归根结底,你必须对为什么抛出异常、抛出的异常如何处理以及在应用程序中如何处理它们有一个明确的要求。 application/logic/rules 要求影响代码中异常处理的设计。

注释(编辑-添加):

  • 有很多文章解释异常处理 在网上的商业应用程序中。可以尝试搜索 像 "Java exceptions best practices" 这样的字符串。这是一个这样的 有一些有用信息的文章:有效Java 异常.
  • 还有 try-catch-finally 构造要考虑(以及 Java 7 引入的各种新 exception features)。