前端 domparser未定义怎么解决_统一异常处理到底应该怎么做呢?

前言

在 Web 开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多人来说, 可能对异常处理有以下几个问题:

  • 什么时候需要捕获(try-catch)异常, 什么时候需要抛出(throws)异常到上层.
  • 在 dao 层捕获还是在 service 捕获, 还是在 controller 层捕获.
  • 抛出异常后要怎么处理. 怎么返回给页面错误信息.

叙述

为什么需要统一异常处理?

使用异常处理的反例

捕获异常后只输出到控制台

前端代码

$

后端代码

try 

这是见过最多的异常处理方式了, 如果这是一个添加商品的方法, 前台通过 ajax 发送请求到后端, 期望返回 json 信息表示添加结果. 但如果这段代码出现了异常:

那么用户看到的场景就是点击了添加按钮, 但没有任何反应(其实是返回了 500 错误页面, 但这里前端没有监听 error 事件, 只监听了 success 事件. 但即使加上了error: function(data) {alert("添加失败");}) 又如何呢? 到底因为啥失败了呢, 用户也不得而知.

后台 e.printStackTrace() 打印在控制台的日志也会在漫漫的日志中被埋没, 很可能会看不到输出的异常. 但这并不是最糟的情况, 更糟糕的事情是连 e.printStackTrace() 都没有, catch 块中是空的, 这样后端的控制台中更是什么都看不到了, 这段代码会像一个隐形的炸弹一样一直埋伏在系统中.

混乱的返回方式

前端代码

$

后端代码

@RequestMapping

一大堆的try catch语句

我们在有的项目中会发现try catch的代码很多,看起来很头疼啊。

导致前后端严重耦合

使用异常处理的好处

  • 代码更加干净清爽
  • 异常统一由项目经理leader使用AOP来进行处理和定义,不需要每个开发自己定义维护
  • 统一的接口返回值,前后端交互更简单。
  • 充分解耦前后端,面向接口编程(符合契约式编程原则)

Java异常分类

88f3aef628306849e6e249411406066f.png

Java把异常当做对象来处理。Throwable是所有错误或异常的超类。Throwable类有两个直接子类:Error类和Exception类。 1、Error是指java运行时系统的内部错误和资源耗尽错误,是程序无法处理的异常,应用程序不会抛出该类对象。 2、Exception是程序本身可以处理的异常,应尽可能去处理这些异常。Exception分两类,一个是运行时异常RuntimeException,一个是检查异常CheckedException。 3、CheckedException一般是外部错误,这种异常都发生在编译阶段,Java编译器会强制程序去捕获此类异常。 4、RuntimeException是那些可能在Java 虚拟机正常运行期间抛出的异常的超类。这种错误是由程序员引起的错误,可以修正代码解决。

异常处理规范应用

不要捕获任何异常

不要在业务代码中进行捕获异常, 即 dao、service、controller 层的所以异常都全部抛出到上层. 这样不会导致业务代码中的一堆 try-catch 会混乱业务代码.

统一返回结果集

不要使用 Map 来返回结果, Map 不易控制且容易犯错, 应该定义一个 Java 实体类. 来表示统一结果来返回, 如定义实体类:

public 

前端代码

{
    

前端统一处理异常

/**

后端统一处理异常

用@ControllerAdvice+@ExceptionHandler实现全局异常处理

通常在Controller层需要去捕获service层的异常,防止返回一些不友好的错误信息到客户端,但如果Controller层每个方法都用模块化的try-catch代码去捕获异常,会很难看也难维护。 异常处理最好是解耦的,并且都放在一个地方集中管理。Spring能够较好的处理这种问题,核心如下,这里主要关注前两个: - @ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度 - @ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离开 - @ResponseStatus:可以将某种异常映射为HTTP状态码

单使用@ExceptionHandler,只能在当前Controller中处理异常,与@ControllerAdvice组合使用,则可以实现全局异常处理,不用每个controller都配置。

@ControllerAdvice

小结

在项目中我们将异常处理从业务代码中解耦出来,实现异常信息的统一处理和维护,减少了模板代码,改善了代码的风格。

感谢您的阅读~~