1. 程式人生 > >SpringBoot 統一異常處理(十六)

SpringBoot 統一異常處理(十六)

每個異常都自己去處理很麻煩,所以我們建立一個全域性異常處理類來統一處理異常

一,首先建立全域性異常處理類:通過使用@ControllerAdvice定義統一的異常處理類,而不是在每個Controller中逐個定義。@ExceptionHandler用來定義函式針對的異常型別,@RestControllerAdvice統一回復ExceptionResponse物件,並轉為為json格式

通用異常返回物件

package com.alen.user.common;

import com.alibaba.fastjson.JSONObject;
import org.springframework.http.HttpStatus;

import java.util.Calendar;

/**
 * 異常資訊返回體
 */
public class ExceptionResponse {
    private Long timestamp;
    private Integer status;
    private String message;

    public ExceptionResponse(HttpStatus statusEnum, String message) {
        this.timestamp = Calendar.getInstance().getTimeInMillis();
        this.status = statusEnum.value();
        this.message = message;
    }

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }


    @Override
    public String toString() {
        return JSONObject.toJSONString(this);
    }
}
自定義業務異常
package com.alen.user.exception;

/**
 * 自定義業務異常
 */
public class BusinessException extends RuntimeException{

    public BusinessException(String s)
    {
        super(s);
    }

}

全域性異常處理類

package com.alen.user.handler;

import com.alen.user.common.ExceptionResponse;
import com.alen.user.exception.BusinessException;
import com.alen.user.exception.SystemException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * Controller全域性異常處理
 * Created by jianchen on 2017/8/11.
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    private final static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 錯誤碼說明
     * HTTP 400 - 請求無效
     * HTTP 401 - 未授權:登入失敗 (401錯誤全部跳轉至登入頁面)
     * HTTP 403 - 沒有許可權:沒有許可權  (提示資訊)
     * HTTP 404 - (未找到)伺服器找不到請求的介面
     * HTTP 406 - 引數錯誤
     * HTTP 417 - 業務處理異常(自定義錯誤資訊)
     * HTTP 500 - 未定義異常(伺服器異常)
     * 其它 未知異常
     */


    /**
     * 自定義業務異常
     * @param e
     * @param httpServletRequest
     * @param httpServletResponse
     * @return
     * @throws IOException
     */
    @ExceptionHandler(BusinessException.class)
    public ExceptionResponse businessExceptionHandler(BusinessException e, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String uri = httpServletRequest.getRequestURI();
        logger.error("當前訪問uri: [{}], 自定義業務異常:[{}]", uri, e);
        httpServletResponse.setStatus(HttpStatus.EXPECTATION_FAILED.value());
        ExceptionResponse exceptionResponse = new ExceptionResponse(HttpStatus.EXPECTATION_FAILED,  e.getMessage());
        return exceptionResponse;
    }


    /**
     * 系統異常
     *
     * @param e
     * @param httpServletRequest
     * @param httpServletResponse
     * @return
     * @throws SystemException
     */
    @ExceptionHandler(SystemException.class)
    public ExceptionResponse systemExceptionHandler(SystemException e, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String uri = httpServletRequest.getRequestURI();
        logger.error("當前訪問uri: [{}], 系統異常(自定義異常):[{}]", uri, e);
        httpServletResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        ExceptionResponse exceptionResponse = new ExceptionResponse(HttpStatus.INTERNAL_SERVER_ERROR,  e.getMessage());
        return exceptionResponse;
    }

    /**
     * IOException
     * @param e
     * @param httpServletRequest
     * @param httpServletResponse
     * @return
     */
    @ExceptionHandler(IOException.class)
    public ExceptionResponse IOExceptionHandler(IOException e, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String uri = httpServletRequest.getRequestURI();
        logger.error("當前訪問uri: [{}], io異常:[{}], 異常資訊:[{}]", uri, e.getClass(), e);
        httpServletResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        ExceptionResponse exceptionResponse = new ExceptionResponse(HttpStatus.INTERNAL_SERVER_ERROR, "檔案傳輸異常");
        return exceptionResponse;
    }

    @ExceptionHandler(RuntimeException.class)
    public ExceptionResponse runtimeExceptionHandler(RuntimeException e, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String uri = httpServletRequest.getRequestURI();
        logger.error("當前訪問uri: [{}], 執行時異常:[{}], 異常資訊:[{}]", uri, e.getClass(), e);
        httpServletResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        ExceptionResponse exceptionResponse = new ExceptionResponse(HttpStatus.INTERNAL_SERVER_ERROR, "系統異常");
        return exceptionResponse;
    }

    @ExceptionHandler(Exception.class)
    public ExceptionResponse exceptionHandler(Exception e, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        String uri = httpServletRequest.getRequestURI();
        logger.error("當前訪問uri: [{}], 異常型別:[{}], 異常資訊:[{}]", uri, e.getClass(), e);
        httpServletResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        ExceptionResponse exceptionResponse = new ExceptionResponse(HttpStatus.INTERNAL_SERVER_ERROR,  "系統異常");
        return exceptionResponse;
    }

}

相關推薦

SpringBoot 統一異常處理

每個異常都自己去處理很麻煩,所以我們建立一個全域性異常處理類來統一處理異常 一,首先建立全域性異常處理類:通過使用@ControllerAdvice定義統一的異常處理類,而不是在每個Controller中逐個定義。@ExceptionHandler用來定義函式針對的異常型別

SpringBoot進階之統一異常處理含原始碼

淺談異常處理 在J2EE專案的開發中,不管是對底層的資料庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常需要處理。每個過程都單獨處理異常,系統的程式碼耦合度高,工作量大且不好統一,維護的工作量也很大。

Python+OpenCV圖像處理—— 輪廓發現

draw 一個 設置 在外 ace align list tco 灰度 簡介:輪廓發現是基於圖像邊緣提取的基礎尋找對象輪廓的方法,所以邊緣提取的閾值選定會影響最終輪廓發現結果。 代碼如下: import cv2 as cv import numpy as np def c

C#-異常處理

範圍 eth 行程 value ole pub 捕獲 顯示轉換 clas 概念  異常處理是指程序在運行過程中,發生錯誤會導致程序退出,這種錯誤,就叫做異常  但並不是所有的錯誤都是異常  而處理這種錯誤,稱為異常處理  異常處理實際是不斷去發掘異常、修改異常,使程序更穩定

SpringBoot入門系列篇:actuator監控模組入門

actuator是SpringBoot提供的一個用於監控的模組,想要在SpringBoot中使用則需要引入該jar包: <dependency> <groupId>org.springframework.boot</gro

學習springBoot 進階統一異常處理

在實際開發當中我們經常會遇到BUG,所以都會封裝一個異常返回類來使用,提示我們到底是那一步出了問題,方便於我們追蹤問題並且解決問題, 以下舉個新增女孩物件為例子,當新增的女孩物件年齡小於10歲時我們提示該女孩在上小學,大於10歲且小於16歲提示可能在上初中,通過例子說明我們如何對異常統一處理並返

企業分布式微服務雲SpringCloud SpringBoot mybatis Spring Boot中使用LDAP來統一管理用戶信息

數據庫表 repo on() intellij attr ads get 可選 mail LDAP簡介 LDAP(輕量級目錄訪問協議,Lightweight Directory Access Protocol)是實現提供被稱為目錄服務的信息服務。目錄服務是一種特殊的數據庫系

Netty in Action 章節 第二部分 ChannelHandlerContext和異常處理

6.3 Interface ChannelHandlerContext 一個ChannelHandlerContext代表了一個ChannelHandler和ChannelPipeline之間的關係,ChannelHandlerContext創建於ChannelHandl

企業分散式微服務雲SpringCloud SpringBoot mybatis Spring Boot中使用LDAP來統一管理使用者資訊

LDAP簡介LDAP(輕量級目錄訪問協議,Lightweight Directory Access Protocol)是實現提供被稱為目錄服務的資訊服務。目錄服務是一種特殊的資料庫系統,其專門針對讀取,瀏覽和搜尋操作進行了特定的優化。目錄一般用來包含描述性的,基於屬性的資訊並

spring boot 1.5.4 統一異常處理

springboot springboot1.5.4 springboot整合springdatajpa springboot集成jdbctemplate springboot異常處理 上一篇:springboot 1.5.4 配置文件詳解(八) 1 Spring Boot統一異

R語言學習筆記處理缺失值

ima 結果 cti img dataset case prop .com log #識別缺失值 install.packages("VIM") data(sleep,package="VIM") #列出沒有缺失值的行 sleep[complete.case

ng機器學習視頻筆記 ——從圖像處理談機器學習項目流程

公眾號 written 字符串分割 評估 jpg 關註 改進 視頻 pip ng機器學習視頻筆記(十六) ——從圖像處理談機器學習項目流程 (轉載請附上本文鏈接——linhxx) 一、概述 這裏簡單討論圖像處理的機器學習過程,主要討論的是機器學習的

Python資料處理 Pandas 合併merce

要點 pandas中的merge和concat類似,但主要是用於兩組有key column的資料,統一索引的資料. 通常也被用在Database的處理當中. 依據一組key合併 import pandas as pd #定義資料集並打印出 left = pd.DataFrame({

篇:SpringBoot統一異常處理

一、什麼是異常處理 異常(Exception)是程式在執行時可能出現的會導致程式執行終止的錯誤。這種錯誤是不能通過編譯系統檢查出來的,如果不進行異常處理,程式將中斷無法提供服務。 二、如何使用Spring Boot異常處理 案例: 獲取某個女生的年齡並判斷小於10,返

一起來學SpringBoot優雅的整合Shiro

Apache Shiro是一個功能強大且易於使用的Java安全框架,可執行身份驗證,授權,加密和會話管理。藉助Shiro易於理解的API,您可以快速輕鬆地保護任何應用程式 - 從最小的移動應用程式到最大的Web和企業應用程式。網上找到大部分文章都是以前Sprin

spring深入學習 IOC 之parentBeanFactory 與依賴處理

繼上篇部落格 【死磕 Spring】—– 載入 bean 之 快取中獲取單例 bean,如果從單例快取中沒有獲取到單例 bean,則說明兩種情況: 該 bean 的 scope 不是 singleton 該 bean 的 scope 是 singleton ,但是沒有初始化

SpringBoot學習-SpringBoot釋出到獨立的tomcat中執行

儘管Spring Boot專案會內建一個tomcat,僅只需通過一個簡單的指令便可啟動專案,但在生產環境下,我們還是習慣將專案釋出到第三外的servlet容器中,下面將介紹如果將一個Spring Boot專案部署到第三方tomcat中執行。 1)修改工程的

Android OpenGLES2.0——3D模型貼圖及光照處理obj+mtl

在Android OpenGLES2.0(十四)——Obj格式3D模型載入中實現了Obj格式的3D模型的載入,載入的是一個沒有貼圖,沒有光照處理的帽子,為了呈現出立體效果,“手動”加了光照,擁有貼圖的紋理及光照又該怎麼載入呢? 模型檔案 本篇部落格例子中

springboot乾貨——使用@Async實現非同步呼叫

非同步呼叫針對的是同步呼叫,一般在程式碼中我們使用同步呼叫相對較多,即請求程式碼立即返回結果或者說執行程式碼,非同步呼叫則是指請求之後不會裡面返回結果或者是呼叫程式碼。 接下來我們用例項來看下什麼是同步呼叫: 新建一個springboot專案後建立對應的task類: pa

java springboot b2b2c shop 多使用者商城系統原始碼 用restTemplate消費服務

構架工程 建立一個springboot工程,去消費RESTFUL的服務。這個服務是 http:///gturnquist-quoters.cfapps.io/api/random ,它會隨機返回Json字串。 在Spring專案中,它提供了一個非常簡便的類,叫RestTempl