SpringBoot異常處理 荊軻

2021-08-16 02:40:41 字數 3411 閱讀 7995

springboot異常處理

做web應用的時候,請求處理過程中發生錯誤是非常常見的情況。spring boot提供了乙個預設的對映:/error,當處理中丟擲異常之後,會轉到該請求中處理,並且該請求有乙個全域性的錯誤頁面用來展示異常內容。但是頁面很不友好,我們需要傳送給一些引數讓前端開發者識別就可以了。

1.狀態碼拋異常

處理web請求時引發的任何未處理的異常都會導致伺服器返回http 500響應。 但是,您自己編寫的任何異常都可以使用@responsestatus注釋(它支援http規範定義的所有http狀態**)進行注釋。 當乙個帶注釋的異常從乙個控制器方法丟擲,而不是在其他地方處理時,它將自動地使用指定的狀態碼返回適當的http響應。

測試用例:

首先寫乙個異常處理類

@responsestatus(value= httpstatus.not_found, reason="找不到內容")

public class tdusernotfoundexception extends runtimeexception

測試類加了乙個註解@responsestatus,就是當出現這個異常的時候的返回狀態。

然後寫controller讓其丟擲tdusernotfoundexception這個異常

執行springboot工程,通過swagger ui工具進行測試,測試結果為:

_100100(100100, "操作失敗,資料校驗失敗,請檢查資料"),
這個方法監控了乙個dataintegrityviolationexception異常,當資料寫入資料庫會對內容進行校驗,看看是否滿足要求,比如非空校驗,使用者名稱的唯一性校驗。

業務方法:

public string createtduser1(tduserdto tduserdto)

如果上面方法出現dataintegrityviolationexception異常會被自動捕捉。

測試:

使用者名稱admin在資料庫已經有了,再次插入會報錯。

3.全域性異常處理

控制器建議允許您使用完全相同的異常處理技術,但將其應用於整個應用程式,而不僅僅是應用於單個控制器。 可以把它們看作是乙個註解驅動的***。

@restcontrolleradvice

@responsebody

public class globalexceptionhandler )

public exceptionbody sqlexception(exception e) ", e.getmessage(), e);

return new exceptionbody(tdresponseinfo._100100);}}

同樣是攔截資料庫檢驗異常,可以專門寫乙個全域性的異常處理類,註解使用

@restcontrolleradvice這樣直接注入到@restcontroller裡面,所有到的contoller出現異常會被自動攔截。

同樣是乙個情景,當使用者註冊乙個username就不能有相同的username,在資料庫裡面新增唯一性約束,然後在實體類也新增約束。

表字段

/** * 使用者名稱

*/@column(nullable = false,name = "username",length = 10,unique = true)

private string username;

controller:
controller方法:

public respbodycreatetdrole(tduserdto tduserdto)

tduser.setsalt(tduserdto.getusername());

tduser.setcreatetime(new date());

tduser.setmodifiedtime(new date());

tduser.setlocked(1);

tduser.setremark("安存管理員");

tduser tduserres = tduserservice.createtduser(tduser);

return new respbody<>(tdresponseinfo._100000,tduserres);

}

預計tduser tduserres = tduserservice.createtduser(tduser);行發生異常。

開始測試:

測試結果:

4.自定義異常處理

有的時候需要自定義一些已知的異常,當異常發生終止程式執行,丟擲指定的返回碼和返回資訊。這個時候可以自定義異常攔截。

public class tdexception extends runtimeexception
自定義異常處理器,注入到@restcontroller

@exceptionhandler(tdexception.class)

public exceptionbody tdexceptionhandler(tdexception tdexception)

使用:

if (tarobjrequest == null || tarobjservice.findonebyid(tarobjrequest.getid()) == null){

logger.error("操作物件不存在");

logger.info("操作物件不存在");

throw new tdexception(tdresponseinfo._100104);

這樣就可以通過全域性異常處理攔截自定義異常了。

springBoot異常處理

使得訪問 exception一定會產生異常 some exception controller public class exceptioncontroller return hello 再寫個全域性異常處理類 controlleradvice public class globalexceptio...

Spring Boot 處理異常

原理 略 1 在template下建立error目錄,在error目錄中,建立404.html頁面,如果發生錯誤 為404,就會去找這個頁面 可以建立所有的狀態碼頁面 2 在error目錄中,建立4xx.html頁,如果找不到對應的狀態碼頁面,就會去找4xx.html頁面 注意4xx.html就是4...

springboot異常處理

1.springboot預設發生異常會跳轉到白頁 2.自定義錯誤頁 我們在templates error路徑下新增404.html和5xxhtml 注意使用 thymeleaf 時候,所有的html檔案要新增命名空間 發生404錯誤時,我們就會自動跳轉到404.html 發生5xx錯誤時,我們自動跳...