91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot全局異常處理的使用方法

發布時間:2021-06-26 14:11:10 來源:億速云 閱讀:152 作者:chen 欄目:大數據

本篇內容主要講解“SpringBoot全局異常處理的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringBoot全局異常處理的使用方法”吧!

I. 環境搭建

首先得搭建一個 web 應用才有可能繼續后續的測試,借助 SpringBoot 搭建一個 web 應用屬于比較簡單的活;

創建一個 maven 項目,pom 文件如下

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7</version>
    <relativePath/> <!-- lookup parent from update -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.45</version>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

依然是一般的流程,pom 依賴搞定之后,寫一個程序入口

/**
 * Created by @author yihui in 15:26 19/9/13.
 */
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

II. 異常處理

1. @ControllerAdvice

我們通常利用@ControllerAdvice配合注解@ExceptionHandler來實現全局異常捕獲處理

  • @ControllerAdvice為所有的 Controller 織入增強方法

  • @ExceptionHandler標記在方法上,表示當出現對應的異常拋出到上層時(即沒有被業務捕獲),這個方法會被觸發

下面我們通過實例進行功能演示

a. 異常捕獲

我們定義兩個異常捕獲的 case,一個是除 0,一個是數組越界異常

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    public static String getThrowableStackInfo(Throwable e) {
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        e.printStackTrace(new java.io.PrintWriter(buf, true));
        String msg = buf.toString();
        try {
            buf.close();
        } catch (Exception t) {
            return e.getMessage();
        }
        return msg;
    }

    @ResponseBody
    @ExceptionHandler(value = ArithmeticException.class)
    public String handleArithmetic(HttpServletRequest request, HttpServletResponse response, ArithmeticException e)
            throws IOException {
        log.info("divide error!");
        return "divide 0: " + getThrowableStackInfo(e);
    }

    @ResponseBody
    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)
    public String handleArrayIndexOutBounds(HttpServletRequest request, HttpServletResponse response,
            ArrayIndexOutOfBoundsException e) throws IOException {
        log.info("array index out error!");
        return "aryIndexOutOfBounds: " + getThrowableStackInfo(e);
    }
}

在上面的測試中,我們將異常堆棧返回調用方

b. 示例服務

增加幾個測試方法

@Controller
@RequestMapping(path = "page")
public class ErrorPageRest {

    @ResponseBody
    @GetMapping(path = "divide")
    public int divide(int sub) {
        return 1000 / sub;
    }

    private int[] ans = new int[]{1, 2, 3, 4};

    @ResponseBody
    @GetMapping(path = "ary")
    public int ary(int index) {
        return ans[index];
    }
}
c. 測試說明

實例測試如下,上面我們聲明捕獲的兩種異常被攔截并輸出對應的堆棧信息;

但是需要注意

  • 404 和未捕獲的 500 異常則顯示的 SpringBoot 默認的錯誤頁面;

  • 此外我們捕獲返回的 http 狀態碼是 200

SpringBoot全局異常處理的使用方法

2. @ResponseStatus

上面的 case 中捕獲的異常返回的狀態碼是 200,但是在某些 case 中,可能更希望返回更合適的 http 狀態碼,此時可以使用ResponseStatus來指定

使用方式比較簡單,加一個注解即可

@ResponseBody
@ExceptionHandler(value = ArithmeticException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleArithmetic(HttpServletRequest request, HttpServletResponse response, ArithmeticException e)
        throws IOException {
    log.info("divide error!");
    return "divide 0: " + getThrowableStackInfo(e);
}

SpringBoot全局異常處理的使用方法

3. 404 處理

通過@ControllerAdvice配合@ExceptionHandler可以攔截 500 異常,如果我希望 404 異常也可以攔截,可以如何處理?

首先修改配置文件application.properties,將NoHandlerFoundException拋出來

# 出現錯誤時, 直接拋出異常
spring.mvc.throw-exception-if-no-handler-found=true
# 設置靜態資源映射訪問路徑,下面兩個二選一,
spring.mvc.static-path-pattern=/statics/**
# spring.resources.add-mappings=false

其次是定義異常捕獲

@ResponseBody
@ExceptionHandler(value = NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleNoHandlerError(NoHandlerFoundException e, HttpServletResponse response) {
    return "noHandlerFound: " + getThrowableStackInfo(e);
}

再次測試如下,404 被我們捕獲并返回堆棧信息

SpringBoot全局異常處理的使用方法

到此,相信大家對“SpringBoot全局異常處理的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠来县| 板桥市| 遂溪县| 甘孜| 新邵县| 界首市| 敦煌市| 南汇区| 营山县| 中西区| 南靖县| 永福县| 来宾市| 康马县| 平利县| 固原市| 和硕县| 长宁县| 定安县| 九龙城区| 武山县| 芒康县| 龙州县| 长丰县| 徐水县| 深水埗区| 武隆县| 高密市| 镇赉县| 盐池县| 慈溪市| 玛曲县| 崇礼县| 涡阳县| 佛坪县| 营口市| 安宁市| 石景山区| 仙游县| 郑州市| 龙川县|