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

我应该把Spring MVC中的异常处理放在哪里?

冀胤运
2023-03-14

我搜索了很多,几乎所有我发现的例子都使用了控制器中的异常处理和自己的异常处理程序。我一直认为这应该在程序的服务层上完成。如果不是,我真的不明白为什么要创建单独的服务层。

另外,如果我在Controller中实现异常处理,是否意味着我必须在前面的所有层中抛出异常?

共有1个答案

裴存
2023-03-14

除非您能够从错误条件中恢复,否则您必须让异常一直弹出到控制器,以便将它们转换为HTTP错误,并将该错误发送回客户端。

因为(例如)“无效输入”必须作为400 Bad requestHTTP状态代码返回到客户端,显然只有Spring MVC控制器能够做到这一点。

这就是为什么为不同种类的错误定义错误处理方法并将异常映射到状态代码可能是一个好主意。这种映射的一个例子是:

  • IllegalArgumentException->400错误请求
  • IllegalStateException->503服务不可用
  • AuthenticationException->401未授权
  • AccessDeniedExceptionSecurityException->403禁止
  • UnsupportedOperationException->501未实现
  • Throwable(任何其他内容)->500内部服务器错误

服务层应该只处理可恢复的异常,并且应该将低级异常转换(包装)成一组一致的定义良好的异常(例如catch(FileNotFoundException e)->throw new IllegalStateException(e))。

所以它不会变得无用。此外,这一层应该包含所有的“业务逻辑”,并让Spring MVC(或任何web框架)控制器只关注HTTP内容。

 类似资料:
  • 在Vaadin 10-14中,我应该将静态文件放在哪里,例如CSS、JavaScript和聚合模板?静态文件(如图像)如何? 此外,如何在Vaadin中导入这些文件?Vaadin 14与npm和Vaadin 10-13与bower之间有差异吗?

  • 以下是在不使用聚合物的情况下运行良好的测试代码: 但我希望在聚合物元素中使用Javascript,并尝试了以下插入: NR 1:脚本标记内的Javascript,模板标记后的Javascript: 我想这意味着,编译器看不到按钮id,因为它在阴影中? 请指示我。

  • 问题内容: 我喜欢Greg解决此问题的方法,但我想指出,你可以直接在管理员中执行相同的操作: 我刚刚开始在django项目中实现信号监听器。虽然我了解它们是什么以及如何使用它们。我很难弄清楚我应该把它们放在哪里。django网站上的文档说: 你可以将信号处理和注册代码放在任何你喜欢的位置。但是,你需要确保该模块所在的模块尽早导入,以便在需要发送任何信号之前注册信号处理。这使你的应用程序的model

  • 我在Laravel应用程序中有两个模型,联系人和地址彼此相关。 联系人字段:[id,姓名]地址字段:[id,地址,联系人id] 在联系人模型中,我添加了: 在地址模型中,我添加了: 我想知道在函数上交换hasOne和belongsTo是可以的,还是会违反现有的任何约定。 如下联系人字段:[id,name,address\u id]地址字段:[id,address] 我这样问的原因是因为我想创建一个

  • 你好,我正在学习OOP,通过编写一个虚拟的库管理项目在Java。 在serachBook()中,如果在ArrayList中找到book,则返回book对象,如果未找到,则抛出自定义异常BookNotFound。 问题1:它应该只返回null并在调用代码时检查返回值是否为null,还是抛出自定义异常BookNotFound。 目前我认为BookNotFinder是合适的,并且目前正在这样做。然而,我

  • 根据 的来源,如果发生错误,将引发异常。 在的大多数示例中,没有使用try-catch,如下所示。为什么不需要错误处理?它安全吗?