JavaWeb项目中如何正确的处理异常

359 阅读3分钟
❗ 本篇文章从相对宏观的角度谈论了: 1. 项目中存在何种异常? 2. 我们应该用什么方法处理这些异常?这些问题。 处理异常的方法多种多样,本文所采用的方法是我经过调研后总结并运用到实际实验室项目开发过程中的,希望看完本章后你也能对在Web项目中处理异常有一定的了解,并使用这些方法运用到实际开发过程中。 如果文章中存在什么问题也欢迎提出,不胜感激。

🌟项目结构(MVC)

通常在项目当中我们采用的是MVC三层架构来构建项目:

Dao层:作为持久层的主要作用是从关系型数据库中读取数据。

Service层:从Dao层读取到的数据在Service层进行业务处理。Service层编写的是业务逻辑代码。

Controller层:把处理好的数据传给Controller层,把数据在前端作展示。


🌟处理异常

在项目当中异常分为很多种,逻辑(业务)异常,代码错误,其他异常

逻辑(业务异常):这类异常常常因为业务无法按照预期进行处理时发生,属于用户给自己造成的意外

代码错误:程序员应该通过测试等手段避免,按理来说等到项目上线时不会发现此类代码错误。

其他异常:这类异常大多在项目中调用持久层时发生,当我们调用SQL语句时我们需要使用 Try Catch的方式对可能发生的异常进行捕获,因为我们不知道SQL语句是否有错误。在使用Catch捕获后我们也要考虑到用户交互的友好性,定义返回给前端的返回数据。


🌟使用全局异常处理捕获逻辑异常

不管在项目后台发生什么异常,项目的使用者都时不关心的,使用者关心的是我此次操作是否成功,以及如果操作失败我应该怎么做?

所以我们需要使用统一异常处理类的原因就是把发生的异常变成对用户友好的方式来告诉他——此次操作并没有按照预期进行。

3.1 自定义逻辑异常处理类

public class EventExtractionException extends RuntimeException{
    public EventExtractionException(String message){
        super(message);
    }
    public EventExtractionException(){
        super("出现异常,请定位异常错误");
    }
}

自定义异常类十分简单,这个类中只有两个构造方法,构造方法的参数(message)是用户能看到的告诉用户的具体信息。

3.2 逻辑异常全局处理器

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(EventExtractionException.class)
    @ResponseBody
    public QueryResponse handleException(EventExtractionException e) {
        return QueryResponse.error(e.getMessage());
    }
}

异常到Controller层之后会被GlobalExceptionHandlder类捕获,如果出现了EventExtractionException异常就会执行 handleException()方法


🌟 使用Try Catch来捕获其他异常

对于项目的维护者来说,出现了异常我们一定要知道哪个地方出现了异常,在Service层当中我们用Try Catch方法来进行异常捕获,当我们捕获到其他异常之后,打印堆栈信息,并记得一定要对前端用户进行相应——返回业务错误信息。

Untitled.png


💡 文章总结: 项目中捕获异常对于项目维护者和项目使用者来说都是有好处的,优雅的捕获异常不仅会让Service层代码看起来更统一简洁,也方便其他人维护,而对于项目使用者来说进行一次操作而系统不进行任何响应用户体验是极差的,而正确的异常捕获则从根本上解决了用户体验的问题。希望本篇文章能对你的后端开发有所帮助和启发。

参考链接:blog.csdn.net/scholar_man…