最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 工程中的異常處理方式

 更新時(shí)間:2021年02月14日 11:31:58   作者:亮亮  
這篇文章主要介紹了SpringBoot 工程中的異常處理方式,幫助大家更好的理解和學(xué)習(xí)使用springboot框架,感興趣的朋友可以了解下

背景分析

在項(xiàng)目的開發(fā)中,不管是對(duì)底層的數(shù)據(jù)邏輯操作過(guò)程,還是業(yè)務(wù)邏輯的處理過(guò)程,還是控制邏輯的處理過(guò)程,都不可避免會(huì)遇到各種可預(yù)知的、不可預(yù)知的異常。處理好異常對(duì)系統(tǒng)有很好的保護(hù)作用,同時(shí)會(huì)大大提高用戶的體驗(yàn)。

異常處理分析

概述

Java項(xiàng)目中處理異常方式無(wú)非兩種,要么執(zhí)行trycatch操作,要么執(zhí)行throw操作(拋給其它對(duì)象處理),無(wú)論采用哪種方式,其目的是讓我們的系統(tǒng)對(duì)異常要有反饋。但現(xiàn)在的問(wèn)題是我們?nèi)绾巫屵@種反饋代碼的編寫即簡(jiǎn)單又直觀、友好。

處理規(guī)范

我們?cè)谔幚懋惓5倪^(guò)程中通常要遵循一定的設(shè)計(jì)規(guī)范,例如:

  • 捕獲異常時(shí)與拋出的異常必須完全匹配,或者捕獲異常是拋出異常的父類類型。
  • 避免直接拋出RuntimeException,更不允許拋出Exception或者Throwable,應(yīng)使用有業(yè)務(wù)含義的自定義異常(例如ServiceException)。
  • 捕獲異常后必須進(jìn)行處理(例如記錄日志)。如果不想處理它,需要將異常拋給它的調(diào)用者。
  • 最外層的邏輯必須處理異常,將其轉(zhuǎn)化成用戶可以理解的內(nèi)容。
  • 避免出現(xiàn)重復(fù)的代碼(Don't Repeat Yourself),即DAY原則。

SpringBoot 工程下的異常處理

準(zhǔn)備工作

第一步:創(chuàng)建項(xiàng)目或module,并添加web依賴,代碼如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

第二步:修改項(xiàng)目訪問(wèn)端口為80,例如

server.port=80

第三步:定義Controller類,代碼如下:

package com.cy.pj.arithmetic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ArithmeticController {

 @RequestMapping("doCompute/{n1}/{n2}")
 @ResponseBody
 public String doCompute(@PathVariable Integer n1, 
 @PathVariable Integer n2){
     Integer result=n1/n2;
     return "Result is "+result;
 }
}

第四步啟動(dòng)項(xiàng)目進(jìn)行訪問(wèn)測(cè)試

在瀏覽器地址欄輸入http://localhost/doCompute/10/2,檢測(cè)輸出結(jié)果。

Result is 5

默認(rèn)異常處理

在瀏覽器地址欄輸入http://localhost/doCompute/10/0,檢測(cè)輸出結(jié)果。

對(duì)于這樣的默認(rèn)異常處理(spring boot提供),用戶體驗(yàn)不太友好,為了呈現(xiàn)更加友好的異常信息,我們通常要對(duì)異常進(jìn)行自定義處理。

自己try異常處理

在控制層方法中,我們可以進(jìn)行try catch處理,例如:

 @RequestMapping("doCompute/{n1}/{n2}")
 @ResponseBody
 public String doCompute(@PathVariable Integer n1, 
 @PathVariable Integer n2){
     try{
     Integer result=n1/n2;
     return "Result is "+result;
     }catch(ArithmeticException e){
     return "exception is "+e.getMessage();
     }
 } 

一個(gè)Controller類中通常會(huì)有多個(gè)方法,這樣多個(gè)方法中都寫try語(yǔ)句進(jìn)行異常處理會(huì)帶來(lái)大量重復(fù)代碼的編寫,不易維護(hù)。

Controller內(nèi)部定義異常處理方法

在Controller類中添加異常處理方法,代碼如下:

@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public String doHandleArithmeticException(ArithmeticException e){
  e.printStackTrace();
  return "計(jì)算過(guò)程中出現(xiàn)了異常,異常信息為"+e.getMessage();
}

@ExceptionHandler注解描述的方法為異常處理方法(注解中的異常類型為可處理的異常類型),假如Controller類中的邏輯方法中出現(xiàn)異常后沒(méi)有處理異常,則會(huì)查找Controller類中有沒(méi)有定義異常處理方法,假如定義了,且可以處理拋出的異常類型,則由異常處理方法處理異常。

控制層中的全局異常處理類及方法定義

當(dāng)項(xiàng)目由多個(gè)控制層類中有多個(gè)共性異常的處理方法定義時(shí),我們可以將這些方法提取到公共的父類對(duì)象中,但是這種方式是一種強(qiáng)耦合的實(shí)現(xiàn),不利于代碼的維護(hù)。我們還可以借助spring框架中web模塊定義的全局異常處理規(guī)范進(jìn)行實(shí)現(xiàn),例如定義全局異常處理類,代碼如下:

package com.cy.pj.common.web;

@RestControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(ArithmeticException.class)
  public String doHandleArithmeticException(ArithmeticException e){
    e.printStackTrace();
    return "計(jì)算過(guò)程中出現(xiàn)了異常,異常信息為"+e.getMessage();
  }
} 

其中,@RestControllerAdvice 注解描述的類為全局異常處理類,當(dāng)控制層方法中的異常沒(méi)有自己捕獲,也沒(méi)有定義其內(nèi)部的異常處理方法,底層默認(rèn)會(huì)查找全局異常處理類,調(diào)用對(duì)應(yīng)的異常處理方法進(jìn)行異常處理。如圖所示:

總結(jié)(Summary)

本小節(jié)主要是對(duì)springboot中的異常處理機(jī)制進(jìn)行了簡(jiǎn)單分析和講解。目的是掌握springboot工程下的異常處理方式,并基于業(yè)務(wù)的不同進(jìn)行響應(yīng)的異常處理。從而有效提高其用戶體驗(yàn),加強(qiáng)系統(tǒng)的容錯(cuò)能力。

以上就是SpringBoot 工程中的異常處理方式的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 異常處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot?Cache?二級(jí)緩存的使用

    SpringBoot?Cache?二級(jí)緩存的使用

    本文主要介紹了SpringBoot?Cache?二級(jí)緩存的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • MyBatis整合Redis實(shí)現(xiàn)二級(jí)緩存的示例代碼

    MyBatis整合Redis實(shí)現(xiàn)二級(jí)緩存的示例代碼

    這篇文章主要介紹了MyBatis整合Redis實(shí)現(xiàn)二級(jí)緩存的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • springmvc如何使用POJO作為參數(shù)

    springmvc如何使用POJO作為參數(shù)

    這篇文章主要介紹了springmvc如何使用POJO作為參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java并發(fā)實(shí)例之CyclicBarrier的使用

    Java并發(fā)實(shí)例之CyclicBarrier的使用

    這篇文章主要介紹了Java并發(fā)實(shí)例之CyclicBarrier的使用,涉及CyclicBarrier的介紹,以及相關(guān)的并發(fā)實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java 實(shí)例化類詳解及簡(jiǎn)單實(shí)例

    java 實(shí)例化類詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了java 實(shí)例化類詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 如何使用@ConditionalOnExpression決定是否生效注釋

    如何使用@ConditionalOnExpression決定是否生效注釋

    這篇文章主要介紹了如何使用@ConditionalOnExpression決定是否生效注釋的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot實(shí)現(xiàn)發(fā)送QQ郵件的示例代碼

    SpringBoot實(shí)現(xiàn)發(fā)送QQ郵件的示例代碼

    這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)發(fā)送QQ郵件功能,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集上

    Java 數(shù)據(jù)結(jié)構(gòu)進(jìn)階二叉樹題集上

    二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將帶你通過(guò)實(shí)際題目來(lái)熟練掌握
    2022-04-04
  • SpringBoot使用AOP實(shí)現(xiàn)統(tǒng)計(jì)全局接口訪問(wèn)次數(shù)詳解

    SpringBoot使用AOP實(shí)現(xiàn)統(tǒng)計(jì)全局接口訪問(wèn)次數(shù)詳解

    這篇文章主要介紹了SpringBoot通過(guò)AOP實(shí)現(xiàn)對(duì)全局接口訪問(wèn)次數(shù)的統(tǒng)計(jì),文章從相關(guān)問(wèn)題展開全文內(nèi)容詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中的優(yōu)化

    Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中的優(yōu)化

    Elasticsearch(ES)使用倒排索引來(lái)加速文本的搜索速度,倒排索引之所以高效,主要是因?yàn)樗淖兞藬?shù)據(jù)的組織方式,使得查詢操作可以快速完成,這篇文章主要給大家介紹了關(guān)于Elasticsearch倒排索引詳解及實(shí)際應(yīng)用中優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

洛川县| 通山县| 玛沁县| 河池市| 富裕县| 博爱县| 承德县| 武穴市| 方正县| 日照市| 龙海市| 安远县| 常德市| 莎车县| 新竹市| 富蕴县| 沧州市| 天祝| 黄大仙区| 阜南县| 潞城市| 焦作市| 池州市| 左云县| 九台市| 乌拉特中旗| 唐山市| 正蓝旗| 融水| 江源县| 三江| 化州市| 蓬溪县| 广昌县| 清徐县| 武川县| 琼中| 保靖县| 方城县| 乐平市| 搜索|