当前位置: 首页 > 知识库问答 >
问题:

如果endpoint路径未知,ExceptionHandler不会捕获HandlerInterceptor异常

彭鹭洋
2023-03-14
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String parameter = request.getHeader("parameter123");
        if (StringUtils.isEmpty(parameter)) {
            throw new IllegalArgumentException("parameter123 not specified");
        }
        [...]
        return true;
    }

在另一个用@ControllerAdvice注释的类中,我有一个ExceptionHandler,它捕获IllegalArgumentException并将其转换为HTTP状态码为400的格式化响应。

当通过触发API的有效路径来执行此操作时,一切正常。当我尝试调用API的无效/不存在路径时,会出现问题。调用HandlerInterceptor并引发异常,但未触发我的ExceptionHandler,结果是基本HTTP状态代码500异常。它似乎都覆盖了基本的HTTP状态404机制,同时也阻止了我的ExceptionHandler的触发(即使Exception.class上的ExceptionHandler也不会被调用)。

欢迎任何关于这种行为的解释!谢谢

共有1个答案

席成仁
2023-03-14

顾名思义,拦截器在处理请求之前调用preHandle()。因此,在您的情况下,当您从preHandle()方法引发异常时,请求不会进一步发送到处理程序方法。另一方面,用ControllerAdvice注释的类将处理由控制器类内的方法引发的异常,但您的请求不会到达控制器方法,这是因为preHandle()中的代码,这就是为什么在用ControllerAdvice注释的类中创建的异常处理程序不会处理您的异常

 类似资料:
  • 我使用以下代码设置了一个异常处理程序 我正在使用Spring Security 3.1。当我尝试在没有身份验证的情况下执行操作时,应用程序会引发 AccessDeniedException。它永远不会出现这种方法。但与其他例外情况一样工作正常。这是它应该工作的方式吗?还是我的代码有问题? 这看起来像一个解决方案。但是,如果我能在一个点上处理异常,那就更好了。 这是我的配置文件 更新 此处,用户未通

  • 我有一个方面类,用于记录使用泛型方法之前和之后(周围)的方法执行情况: 在方法中,我抛出了一个在logMethod中捕获的可抛出异常,并抛出了一个自定义异常,而不是类型 在我的控制器建议中,我有以下内容: 项目结构: 控制台:

  • 我有一个MVC Java配置,但并不排除某些模式。 在标有xxx的行处,如果 感谢你的指点。 谢谢

  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们

  • 我对Java线程、Runnable等相当陌生。因此,我想知道为什么下面的代码没有捕获异常? 阅读有没有一种方法可以使Runnable的run()引发异常,我收集到: "...如果您的run()方法确实是Thread的目标,则抛出异常是没有意义的,因为它是不可观察的;抛出异常与不抛出异常(无)具有相同的效果。"(@erickson) 我应该检查Runnable.run()方法中的异常。 为什么会这样

  • 为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?