gpt4 book ai didi

java - 拦截@Finally 和@Catch

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:55 25 4
gpt4 key购买 nike

我正在尝试使用拦截@Finally在 Controller 中进行异常处理的演示。

我在 Controller 中故意创建了一个 NullPointerException 并尝试在 @Finally block 中捕获异常。

当我尝试这个时,它就起作用了:

@Finally
static void log(Throwable e) {
if( e == null ){
Logger.info("Inside FInally: Action call was successful");
} else{
Logger.info("Inside Finally: Action call failed", e);
}
}

但是如果我尝试这样做,它就不起作用:

@Finally
static void log(NullPointerException e) {
if( e == null ){
Logger.info("Inside FInally: Action call was successful");
} else{
Logger.info("Inside Finally: Action call failed", e);
}
}

如果我再次考虑 @Catch 拦截,那么以下两项都有效:

 @Catch(value = Throwable.class , priority = 2)
public static void te(Throwable throwException){
.....
}

@Catch(value = NullPointerException.class , priority = 1)
public static void npe(Throwable throwNullPointerException){
.....
}

为什么第二种情况在@Finally拦截中不起作用?对于任何类型的异常,是否强制使用 only Throwable 父类(super class),而不是使用任何特定的子类异常?

请让我知道这一点。

最佳答案

在线开发人员指南没有明确说明不能使用特定的异常类型。但考虑到这个 @Finally 拦截背后的想法,我想你是对的;也就是说,@Finally 只接受 Throwable。

我们这样想一下,如果方法中有多个catch语句,如果抛出异常,只会触发一个catch,怎么办?在这种情况下,如果参数是NPE,但实际上抛出了DBConnectionTimeout(例如),则会令人困惑。因此,您的拦截器无法与其他类型的异常(exception)一起工作,也不能拥有多个@Finally 拦截器。

关于java - 拦截@Finally 和@Catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14669786/

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