我正在尝试拥有一种可以处理各种异常的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
}
我正在尝试提出一种更干净的方法来编写捕获块。
答案 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块内进行处理。该方法还会引发异常。
这里有两个选项可供考虑:
方法引发异常的目的是在其他地方处理它,就像在调用方法中一样。处理就像从异常问题中恢复或显示消息,中止事务或业务逻辑定义的任何操作。
是否由于业务逻辑问题而引发异常?如果是这样,您很可能会向用户显示一条消息或对该消息进行其他逻辑处理,并且/或者采取进一步措施从该消息中恢复-在业务规则允许的范围内。
如果由于应用程序的逻辑无法恢复而引发异常,请执行适当的操作。
最终,您必须明确要求引发异常的原因,如何处理引发的异常以及如何在应用程序中处理它们。应用程序/逻辑/规则要求会影响代码中异常处理的设计。
注释(编辑添加):
try-catch-finally
构造(以及Java 7中引入的各种新exception features)。