欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用ExceptionHandler做異常處理

 更新時間:2021年06月29日 09:05:15   作者:李曉LOVE向陽  
這篇文章主要介紹了SpringBoot使用ExceptionHandler做異常處理,這篇文章通過多種方法案例來介紹該項技術的使用,需要的朋友可以參考下

應用程序在運行過程中,會有大量需要處理的異常。在頁面解析的一個工程中,會存在多個service類同時出現(xiàn)頁面解析異常和解析結果入庫異常,而這就表示在程序中需要一個機制,去統(tǒng)一處理這些異常,提供統(tǒng)一的異常處理。因為我設計這個結構的主要目的是為了簡化代碼。

在探尋spring的異常處理機制的時候,主要有三種方式來統(tǒng)一處理異常。三種方式都是使用的@ExceptionHandler注解。

@ExceptionHandler注解解釋:
當一個Controller中有方法加了@ExceptionHandler之后,這個Controller其他方法中沒有捕獲的異常就會以參數(shù)的形式傳入加了@ExceptionHandler注解的那個方法中。

三種方式都需要首先為自己的系統(tǒng)設計一個自定義的異常類,通過它來傳遞狀態(tài)碼,以及一些其他參數(shù)信息。

public class ProcessException extends RuntimeException {
 
    private static final long serialVersionUID = 1L;
 
    // 任務明細ID
    protected String rwmxid;
 
    public ProcessException(String rwmxid) {
        this.rwmxid = rwmxid;
    }
 
    public String getRwmxid() {
        return rwmxid;
    }
 
    public void setRwmxid(String rwmxid) {
        this.rwmxid = rwmxid;
    }
    
}

第一種思路,設計一個基類。類中使用@ExceptionHandler注解 表明要做異常處理的方法

/**
 * Created by liuruijie.
 * 處理異常的類,需要處理異常的Controller直接繼承這個類
 */
public class BaseController {
    /**
     * 處理Controller拋出的異常
     * @param e 異常實例
     * @return Controller層的返回值
     */
    @ExceptionHandler
    @ResponseBody
    public Object expHandler(Exception e){
        if(e instanceof SystemException){
            SystemException ex= (SystemException) e;
            return WebResult.buildResult().status(ex.getCode())
                            .msg(ex.getMessage());
        }else{
            e.printStackTrace();
            return WebResult.buildResult().status(Config.FAIL)
                            .msg("系統(tǒng)錯誤");
        }
    }
}

這種方式的缺點為:之后所有需要異常處理的Controller都繼承這個類,從而獲取到異常處理的方法。

雖然這種方式可以解決問題,但是極其不靈活,因為動用了繼承機制就只為獲取一個默認的方法,這顯然是不好的。

第二種方式,將這個基類變?yōu)榻涌?,提供此方法的默認實現(xiàn)(也就是接口中的default方法,java8開始支持接口方法的默認實現(xiàn))

/**
 * Created by liuruijie.
 * 接口形式的異常處理
 */
public interface DataExceptionSolver {
    @ExceptionHandler
    @ResponseBody
    default Object exceptionHandler(Exception e){
        try {
            throw e;
        } catch (SystemException systemException) {
            systemException.printStackTrace();
            return WebResult.buildResult().status(systemException.getCode())
                    .msg(systemException.getMessage());
        } catch (Exception e1){
            e1.printStackTrace();
            return WebResult.buildResult().status(Config.FAIL)
                    .msg("系統(tǒng)錯誤");
        }
    }
}

這種方式雖然沒有占用繼承,但是也不是很優(yōu)雅,因為幾乎所有的Controller都需要進行異常處理,于是我每個Controller都需要去寫implement DataExceptionSolver,這顯然不是我真正想要的。況且這種方式依賴java8才有的語法,這是一個很大的局限。

第三種方式,使用加強Controller做全局異常處理。

所謂加強Controller就是@ControllerAdvice注解,有這個注解的類中的方法的某些注解會應用到所有的Controller里,其中就包括@ExceptionHandler注解。
于是可以寫一個全局的異常處理類:

/**
* @ClassName ExceptionHandle 
* @Description 統(tǒng)一處理控制層的異常
* @date 2020年3月14日 上午9:55:41 
* @version 1.0
 */
@ControllerAdvice
public class ExceptionHandle {
    private final Logger log = LoggerFactory.getLogger(getClass());
 
   @ExceptionHandler(ParseException.class)
   public void parseException(ParseException ex) {
       ex.printStackTrace();
       log.error("parseException ",ExceptionUtil.getMessage(ex));
 
       Map<String,Object> paraMap = new HashMap<String,Object>();
       paraMap.put("rwmxid", ex.getRwmxid());
       CommonUtil.updateDataLog(paraMap);
   }
   
 
   @ExceptionHandler(ProcessException.class)
   public void processException(ProcessException ex) {
       ex.printStackTrace();
       log.error("ProcessException ",ExceptionUtil.getMessage(ex));
 
       Map<String,Object> paraMap = new HashMap<String,Object>();
       paraMap.put("rwmxid", ex.getRwmxid());
       CommonUtil.updateDataLog(paraMap);
   }
   
 
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public TransEntity<?> error(Exception ex) {
        ex.printStackTrace();
        log.error("Exception ",ExceptionUtil.getMessage(ex));
        
        return TransEntity.error();
    }
    
}

如此,我們現(xiàn)在的Controller中的方法就可以很簡潔了:

/**
 * Created by liuruijie on 2016/12/28.
 * 賬號
 */
@RestController
@RequestMapping("passport")
public class PassportController {
    PassportService passportService;
        @RequestMapping("login")
    public Object doLogin(HttpSession session, String username, String password){
        User user = passportService.doLogin(username, password);
        session.setAttribute("user", user);
        return WebResult.buildResult().redirectUrl("/student/index");
    }
}

在passprotService的doLogin方法中,可能會拋出用戶名或密碼錯誤等異常,然后就會交由ExceptionHandle 去處理,直接返回異常信息給前端,然后前端也不需要關心是否返回了異常,因為這些都已經(jīng)定義好了。 

如果我們自定義了異常,也可以在指定拋出我們自定義的異常,然后在全局異常處理類中進行處理, @ExceptionHandler(ParseException.class) 表明,會處理拋出的 ParseException 異常。

到此這篇關于SpringBoot使用ExceptionHandler做異常處理的文章就介紹到這了,更多相關SpringBoot使用ExceptionHandler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于Java網(wǎng)絡編程和多線程的多對多聊天系統(tǒng)

    基于Java網(wǎng)絡編程和多線程的多對多聊天系統(tǒng)

    這篇文章主要介紹了基于Java網(wǎng)絡編程和多線程的多對多聊天系統(tǒng),文中有非常詳細的代碼示例,對正在學習java網(wǎng)絡編程的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java OOM原因以及解決方案

    Java OOM原因以及解決方案

    這篇文章主要介紹了Java OOM原因以及解決方案,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 搭建SpringBoot項目三種方式(圖文教程)

    搭建SpringBoot項目三種方式(圖文教程)

    Springboot作為當下最主流的java開發(fā)框架,已成為IT從業(yè)人員的入門必備技能,本文主要介紹了搭建SpringBoot項目三種方式,感興趣的可以了解一下
    2023-09-09
  • 簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    這篇文章主要介紹了簡單的理解java集合中的HashSet和HashTree幾個重寫方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 基于request.getAttribute與request.getParameter的區(qū)別詳解

    基于request.getAttribute與request.getParameter的區(qū)別詳解

    本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下
    2013-04-04
  • Spring?boot?集成?MQTT詳情

    Spring?boot?集成?MQTT詳情

    這篇文章主要介紹了Spring?boot?集成?MQTT詳情,MQTT是一種基于發(fā)布/訂閱模式的"輕量級"通訊協(xié)議,可以以極少的代碼和有限的帶寬為連接遠程設備提供實時可靠的消息服,下文更多相關介紹,需要的小伙伴可以參考一下
    2022-04-04
  • java的靜態(tài)方法調(diào)用方式

    java的靜態(tài)方法調(diào)用方式

    這篇文章主要介紹了java的靜態(tài)方法調(diào)用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id

    如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id

    這篇文章主要介紹了如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • java利用Future實現(xiàn)多線程執(zhí)行與結果聚合實例代碼

    java利用Future實現(xiàn)多線程執(zhí)行與結果聚合實例代碼

    這篇文章主要給大家介紹了關于java利用Future實現(xiàn)多線程執(zhí)行與結果聚合的相關資料,Future模式的核心,去除了主函數(shù)的等待時間,并使得原本需要等待的時間段可以用于處理其他業(yè)務邏輯,需要的朋友可以參考下
    2021-12-12
  • 淺析Java隨機數(shù)與定時器

    淺析Java隨機數(shù)與定時器

    本篇文章給大家分析了Java隨機數(shù)與定時器的實現(xiàn)原理以及代碼分享,有需要的讀者參考下吧。
    2018-02-02

最新評論