提问人:andreiiz 提问时间:10/25/2023 最后编辑:andreiiz 更新时间:10/26/2023 访问量:60
如何在java中以相同的方法发送异常并返回值
How to send exception and return a value in the same method in java
问:
我知道不可能抛出异常并以相同的方法返回一个值,但我需要以某种方式执行此操作。我想使用 finally 块抛出异常并在返回值后。 像这样:
public Type myMethod() {
try{
//some elaborations
return result;
} catch(MyException myException) {
//do something
return result;
} finally {
if(myException != null) {
throw myException ;
}
}
有没有可能这样的事情,或者我怎样才能做到这一点?
编辑:或者我可以用不同的方法拆分吗?
答:
0赞
StackFlowed
10/25/2023
#1
简短的回答是肯定的。创建一个具有 2 种数据类型异常和返回值的类。
public class ReturnExceptionResult {
Object result;
Exception ex;
...
}
public ReturnExceptionResult myMethod() {
Object result;
Exception ex;
try{
//some elaborations
result=returnvalue;
} catch(MyException myException) {
//do something
ex=myException;
result=returnvalue;
}
return new ReturnExceptionResult(result,ex);
}
评论
0赞
andreiiz
10/25/2023
这样,在返回 ReturnExceptionResult 后,我必须决定是抛出异常还是使用结果,所以这同样是无用的
1赞
Arfur Narf
10/26/2023
从本质上讲,您似乎在问如何同时正常返回和不正常返回。看到问题了吗?可以正常返回,将异常对象作为返回值的一部分,也可以引发异常,将返回值作为异常对象的一部分。
2赞
vsfDawg
10/25/2023
#2
请考虑创建一个自定义异常,其中包含原始 Exception 作为原因和当前值。
一个幼稚的例子:
public class ValueException<T> extends Exception {
private T value;
public ValueException(T value, Exception cause) {
super(cause);
this.value = value;
}
... stuff ...
}
在您的方法中...
public Type myMethod() throws ValueException {
Type result = null;
try {
//some elaborations
return result;
} catch(Exception e) {
throw new ValueException(result, e);
}
}
一些来电者...
public Type getType() {
try {
return myMethod();
} catch (ValueException e) {
if (isGoodEnough(e.getValue()) {
return e.getValue();
}
throw new RuntimeException("Failed to get Type", e);
}
评论
0赞
Rob Spoor
10/25/2023
可以使用 检索原始错误。如果您知道它的类型,则可以重新抛出它(使用强制转换,作为返回)。例如e.getCause()
getCause()
Throwable
throw (RuntimeException) e.getCause();
0赞
Reilas
10/26/2023
#3
"...我知道不可能抛出异常并以相同的方法返回一个值,但我需要以某种方式执行此操作。...
。有没有可能这样的事情......我可以用不同的方法拆分吗?
最简单的方法是使用类。
class Result<T> {
T value;
Throwable e;
}
下面是一个 r 将始终包含“abc”的示例。
Result x() {
Result<String> r = new Result<>();
try {
Integer.parseInt(r.value = "abc");
} catch (Exception e) {
r.e = e;
}
return r;
}
您需要检查 e 是否为 null。
Result<String> r = x();
if (r.e != null) System.out.println(r.e);
System.out.println("r.value = " + r.value);
评论
finally
return
throw
return
finally
return
throw