3

我有一个带@Aspect注释的类正在调用ProceedingJoinPoint#proceed(). 这个方法throws 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
        }
    }
}

在我必须调用另一个方法的情况下myMehtod抛出一个是否可以?我应该避免投掷并以某种方式将其转换为or吗?Throwablethrows ThrowableThrowableExceptionError

无论哪种情况,我也想知道为什么。谢谢你。

4

2 回答 2

5

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

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

如何包装它取决于您对代码调用者的期望。如果任何 Throwable 可能是一种没有人可以做任何事情来纠正或解决的情况,那么您不妨将其包装在未经检查的 RuntimeException 中:

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

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

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);
    }
}
于 2016-02-10T14:52:02.197 回答
-1

如果你使用Lombok,你可以使用@SneakyThrows来重新抛出 Throwable 而不声明它。

@Aspect
@Component
public class MyClass{

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

    @SneakyThrows
    public Object proceed(ProceedingJoinPoint joinPoint) {
        return joinPoint.proceed();
    }
}

这是我知道避免捕获和包装 Throwable 或已检查异常的唯一方法。

于 2019-06-04T09:03:49.120 回答