gpt4 book ai didi

java - 在处理抛出 Throwable 的方法时,我应该避免抛出 Throwable 吗?

转载 作者:行者123 更新时间:2023-12-02 09:39:17 26 4
gpt4 key购买 nike

我有一个带 @Aspect 注释的类正在调用 ProceedingJoinPoint#proceed() 。此方法抛出 Throwable,因此该类看起来像这样:

@Aspect
@Component
public class MyClass{

@Around("@annotation(myAnnotation)")
public Object myMethod(final ProceedingJoinPoint joinPoint) throws Throwable {
//some code here
try {
return joinPoint.proceed();
} finally {
//some more code here
}
}
}

在这种情况下,我必须调用另一个抛出 Throwable 的方法,myMehtod 可以抛出一个 Throwable 吗?我应该避免抛出 Throwable 并以某种方式将其转换为 ExceptionError 吗?

无论哪种情况,我也想知道原因。谢谢。

最佳答案

不,抛出 Throwable 是不行的。错误和未经检查的异常不应该被捕获;错误是严重或致命的系统问题,而未经检查的异常(通常)会暴露程序员的错误。使用 throws Throwable 声明签名会强制调用者捕获并允许他们抑制不应捕获或抑制的内容。

如果可能的话,您应该修复 ProceedingJoinPoint.proceed() 方法的签名,但如果您无法控制该类,您自己的代码应该将其包装在更合理的异常中.

如何包装它取决于您对代码调用者的期望。如果任何 Throwable 可能是无人能采取任何措施来纠正或解决的情况,您不妨将其包装在未经检查的 RuntimeException 中:

try {
return joinPoint.proceed();
} catch (Throwable t) {
throw new RuntimeException(t);
} finally {
//some more code here
}

如果您想确保调用者优雅地处理所有 Throwable,您应该创建自己的特定于应用程序的异常类:

try {
return joinPoint.proceed();
} catch (Throwable t) {
throw new JoinPointException(t);
} finally {
//some more code here
}

异常类很简单:

public class JoinPointException
extends Exception {
private static final long serialVersionUID = 1;

public JoinPointException(Throwable cause) {
super(cause);
}

public JoinPointException(String message,
Throwable cause) {
super(message, cause);
}
}

关于java - 在处理抛出 Throwable 的方法时,我应该避免抛出 Throwable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com