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

Java 如何调用在catch块中抛出异常的方法?,java,exception-handling,try-catch,throws,Java,Exception Handling,Try Catch,Throws,我正在尝试一个HandleException方法,它可以处理各种异常 问题是,我的函数返回一个值。但是如果我在catch块中使用HandleException,Java会抱怨函数不返回值,即使我的HandleException总是抛出异常 解决这个问题的好方法是什么?谢谢 下面是一个示例代码 public class MyException { static int foo(int num) throws Exception { try { re

我正在尝试一个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);
    }
}

我试图找到一种更干净的方法来编写catch块。

这是因为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);
    }
}

这是因为在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);
    }
}
foo方法的返回类型是int,handleException的返回类型是void,这就是编译器给出错误的原因

1在这里,您可以通过以下方式解决此问题:

再次按原样抛出异常

try{
      return bar(num);
}
catch(Exception e){
      handleException(e);
      throw e;
}
2此外,如果您想抛出新创建的异常,则将handleException的返回类型更改为exception。使用

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

1在这里,您可以通过以下方式解决此问题:

再次按原样抛出异常

try{
      return bar(num);
}
catch(Exception e){
      handleException(e);
      throw e;
}
2此外,如果您想抛出新创建的异常,则将handleException的返回类型更改为exception。使用

在我最初的类中,我有很多方法都采用这种格式。。。我 我正试图想出一种更简洁的方法来编写catch块

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

考虑方法:int fooint num throws Exception

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

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

这里有两种选择需要考虑:

重新抛出一个异常,就像自定义业务/应用程序异常一样,只需记录它并重新抛出相同的异常或自定义异常,这些异常需要在其他地方处理—即在堆栈上的调用方法中。 处理异常:这意味着该方法处理异常。某些业务/应用程序逻辑发生在异常处理中。并且,该方法返回一个值。 抛出异常的方法的目的是在其他地方处理它,比如在调用方法中。处理可能类似于从异常问题中恢复、显示消息、中止事务或业务逻辑定义的任何内容

引发异常是否是因为业务逻辑问题?如果是这样的话,您很可能会向用户显示一条消息,或者对其执行一些其他逻辑操作,并/或采取进一步的步骤从中恢复—只要业务规则允许

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

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

注释编辑添加:

有相当多的文章解释了异常处理 网上的商业应用程序。你可以试试搜索 类似字符串的Java异常最佳实践。这里有一个这样的例子 包含一些有用信息的文章:。 最后还尝试用java 7引入各种新的构造来考虑。 在我最初的类中,我有很多方法都采用这种格式。。。我 我正试图想出一种更简洁的方法来编写catch块

我认为问题更多的是理解应用程序中如何处理异常;在通用电气公司,这是一个设计问题 内尔

考虑方法:int fooint num throws Exception

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

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

这里有两种选择需要考虑:

重新抛出一个异常,就像自定义业务/应用程序异常一样,只需记录它并重新抛出相同的异常或自定义异常,这些异常需要在其他地方处理—即在堆栈上的调用方法中。 处理异常:这意味着该方法处理异常。某些业务/应用程序逻辑发生在异常处理中。并且,该方法返回一个值。 抛出异常的方法的目的是在其他地方处理它,比如在调用方法中。处理可能类似于从异常问题中恢复、显示消息、中止事务或业务逻辑定义的任何内容

引发异常是否是因为业务逻辑问题?如果是这样的话,您很可能会向用户显示一条消息,或者对其执行一些其他逻辑操作,并/或采取进一步的步骤从中恢复—只要业务规则允许

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

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

注释编辑添加:

有相当多的文章解释了异常处理 网上的商业应用程序。你可以试试搜索 类似字符串的Java异常最佳实践。这里有一个这样的例子 包含一些有用信息的文章:。 最后还尝试用java 7引入各种新的构造来考虑。
我不明白你的问题。。。在另一个方法中抛出异常并捕获它,您的代码MyException.java无法编译。下面是Oracle Java教程中关于异常及其处理的一些有用说明。。然后在catch块中返回它。正如我提到的,这只是一个示例代码,我写它是为了解释我试图解决的更大的问题。我不理解你的问题。。。在另一个方法中抛出异常并捕获它,您的代码MyException.java无法编译。下面是Oracle Java教程中关于异常及其处理的一些有用说明。。然后在catch块中返回它。正如我提到的,这只是一个示例代码,我编写它是为了解释我试图解决的更大的问题。