1. 程式人生 > >在pring基礎上實現自定義異常處理框架教程

在pring基礎上實現自定義異常處理框架教程

應用專案大致的體系結構:

    
 

 該異常處理框架滿足的要求:

  • 完整的異常組織結構
  • 異常的統一處理
  • 可配置,受管式,方便使用

完整的異常組織結構:

  • 使用者可以方便的定義自己的異常,但所有UncheckedException需要繼承BaseAppRuntimeException,所有的checked Exception可以繼承BaseAppException,或者需要丟擲且不需要check時用WrapperredAppException封裝後丟擲
  • 合理地使用checked異常
  • Exception有唯一的error code,這樣使用者報告異常後,可以根據異常號找到相應Exception,把exception直接顯示給使用者也沒有太大的意義,如何紀錄exception那就是下文講到的ExceptionHandler的職責了。
  • 如果是第三方包括jdk中的異常,需要封裝成BaseAppException或者BaseAppRuntimeException後丟擲

                                      

統一的異常處理

異常統一在框架中進行處理,不需要在上層應用的程式碼中去處理丟擲的異常。為了儘量捕捉到所有的異常,將異常處理放在了ActionBroker中,這樣凡是action以後丟擲的異常都可以捕捉到,因為webservice只是簡單的呼叫action類的方法,一般不會出現異常。當我們捕捉到異常後,需要進行異常處理,定義了ExceptionHandler介面,用介面抽象出異常處理類的具體實現。


                         

USFContextFactory: 建立ExceptionContext的工廠

[java] view plain copy  print?
  1. package com.ldd0.exception.context;  
  2. publicclass CoreContextFactory {  
  3.     privatestatic CoreContextFactory instance;  
  4.     privatevolatile ExceptionContext exceptionContext;  
  5.     private Object exceptionContextLock = new Object();  
  6.     private CoreContextFactory() {  
  7.     }  
  8.     publicstaticsynchronized CoreContextFactory getInstance() {  
  9.         if (null == instance) {  
  10.             instance = new CoreContextFactory();  
  11.         }  
  12.         return instance;  
  13.     }  
  14.     public ExceptionContext getExceptionContext() {  
  15.         ExceptionContext tempExpContext = exceptionContext;  
  16.         if (tempExpContext == null) {   
  17.             synchronized (exceptionContextLock) {  
  18.                 tempExpContext = exceptionContext;  
  19.                 if (tempExpContext == null)  
  20.                     exceptionContext = tempExpContext = new ExceptionContext();  
  21.             }  
  22.         }  
  23.         return tempExpContext;  
  24.     }  
  25. }  

ExceptionContext: 存放全域性的exception資訊

[java] view plain copy  print?
  1. package com.ldd600.exception.context;  
  2. import java.util.ArrayList;  
  3. import java.util.Collection;  
  4. import java.util.Collections;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.Set;  
  9. import org.springframework.util.Assert;  
  10. import com.ldd600.exception.base.BaseAppRuntimeException;  
  11. import com.ldd600.exception.base.ConfigException;  
  12. import com.ldd600.exception.base.handler.ExceptionHandler;  
  13. import com.ldd600.exception.config.ExceptionDefinition;  
  14. publicclass ExceptionContext {  
  15.     private Map<Class<?>, ExceptionDefinition> exceptionMap;  
  16.     private Map<String, ExceptionHandler> handlers = new HashMap<String, ExceptionHandler>();  
  17.     ExceptionContext() {  
  18.         exceptionMap = new HashMap<Class<?>, ExceptionDefinition>();  
  19.     }  
  20.     publicboolean containsException(Class<?> expClazz) {  
  21.         return (exceptionMap.containsKey(expClazz));  
  22.     }  
  23.     publicvoid addExceptionHander(Class<?> expClazz, Class<? extends ExceptionHandler> handlerClazz) {  
  24.         try {  
  25.             ExceptionDefinition definition = getRealExceptionDefinition(expClazz);  
  26.             if (null == definition) {  
  27.                 thrownew IllegalArgumentException(expClazz.getName() + "not in the context, please configure or add it to the context first!!");  
  28.             }   
  29.             ExceptionHandler handler = handlers.get(handlerClazz.getName());  
  30.             if (null == handler) {  
  31.                 handler = handlerClazz.newInstance();  
  32.                 handlers.put(handlerClazz.getName(), handler);  
  33.             }  
  34.             definition.getHandlerNames().add(handlerClazz.getName());  
  35.         } catch (Exception ex) {  
  36.             thrownew ConfigException("Add exception handler to context failure!", ex);  
  37.         }  
  38.     }  
  39.     publicvoid addExceptionHandler(Class<?> expClazz, String errorCode, Class<? extends ExceptionHandler> handlerClazz) {  
  40.         Assert.hasLength(errorCode, expClazz + " errorCode must not be null or empty string!");  
  41.         ExceptionDefinition definition = getRealExceptionDefinition(expClazz);  
  42.         if(null == definition) {  
  43.             definition = new ExceptionDefinition(errorCode);  
  44.             exceptionMap.put(expClazz, definition);  
  45.         }  
  46.         addExceptionHander(expClazz, handlerClazz);  
  47.     }  
  48.     publicvoid addExceptionHandlers(Class<?> expClazz, Class<? extends ExceptionHandler> handlerClazzes) {  
  49.         for(Class<? extends ExceptionHandler> handlerClazz : handlerClazzes) {  
  50.             addExceptionHander(expClazz, handlerClazz);  
  51.         }  
  52.     }  
  53.     publicvoid removeExceptionHandler(Class<?> expClazz, Class<? extends ExceptionHandler> handlerClazz) {  
  54.         Assert.isTrue(containsException(expClazz));  
  55.         String handlerName = handlerClazz.getName();  
  56.         getExceptionDefinition(expClazz).getHandlerNames().remove(handlerName);  
  57.         Collection<ExceptionDefinition> definitons = exceptionMap.values();  
  58.         boolean isClearHandler = true;  
  59.         for (ExceptionDefinition expDefinition : definitons) {  
  60.             if (expDefinition.getHandlerNames().contains(handlerName)) {  
  61.                 isClearHandler = false;  
  62. 相關推薦

    pring基礎實現定義異常處理框架教程

    應用專案大致的體系結構:         該異常處理框架滿足的要求: 完整的異常組織結構異常的統一處理可配置,受管式,方便使用 完整的異常組織結構: 使用者可以方便的定義自己的異常,但所有UncheckedException

    在java Spring基礎實現定義異常處理框架教程

    應用專案大致的體系結構:         該異常處理框架滿足的要求: 完整的異常組織結構異常的統一處理可配置,受管式,方便使用 完整的異常組織結構: 使用者可以方便的定義自己的異常,但所有UncheckedException需要繼承BaseAppRuntimeExce

    Spring boot+Security OAuth2 爬坑日記(4)定義異常處理

    為了方便與前端更好的互動,服務端要提供友好統一的資訊返回格式,(他好我也好 ->_-> ),Spring Security OAuth2 提供了自定義異常的入口;我們需要做的就是實現對應的介面,然後將實現的類配置到對應的入口即可。預設的資訊返回格式

    Springboot定義異常處理

    tro 定義 異常 handler .get png map spa sta 1.自定義異常類 import lombok.Data; @Data public class UserException extends RuntimeException { pr

    java實現定義異常例項程式碼

    此處主要便於對異常類的使用上方便大家理解以一個公約數為例做了一個簡單自定義異常的處理程式碼如下: 如果操作者輸入數字符合要求程式執行,不符合則丟擲錯誤。 package 自定義異常簡單例項; import java.util.Scanner; public class CommonDivisor

    定義異常處理類及錯誤提示類的使用技巧

    一.關於自定義處理異常類及聯合自定義錯誤提示類的使用     1.專案內自定義py檔案,使用者存放自定義的錯誤提示類 class BaseResponse(object):     def __init__(self):

    shiro與spring security如何用定義異常處理401

    背景 現在是前後端分離的時代,後端必然要統一處理返回結果,比如定義一個返回物件 public class ResponseData<T> { /** * 統一返回碼 */ public String rtnCode; /*

    springboot錯誤資訊返回與定義異常處理

    在很多系統中,我們可能在執行時出現各種異常,有系統異常,程式碼異常,自定義的異常。這時候我們就要把這些錯誤異常資訊返回去給客戶端檢視才知道是哪裡出問題。這裡我們就說說spring boot的異常處理。   springboot錯誤資訊返回: 實際上,如果我們訪問一個url,不同

    datatables定義異常處理

    關閉alert提示,改為控制檯輸出錯誤 $.fn.dataTable.ext.errMode = 'none'; $('#example') .on( 'error.dt', function ( e, settings, techNote, message ) {

    java定義異常處理

    /*** * 為什麼使用自定義異常? * 更加精確定位具體異常資訊 * * 繼承RuntimeException,實現RuntimeException的所有構造方法,就是一種自定義異常類 * */ public class ServiceException extends Runti

    在Android原有的api基礎新增定義方法進行呼叫

          因為自己對相機還是情有獨鍾,也挺感興趣的,所以這裡就拿相機來做一個例子來說一下這個過程! 一、我們找到相機很重要的camera類來新增一個自己的方法。       我這裡用到的並不是Google原生釋放的Android原

    Java程式設計中Springboot的異常處理定義異常處理教程

    元旦很快就到來了,提前祝各位元旦快樂,今天給大家分享一個工作中必用一個知識點,就是在Java開發中使用列舉構建自定義異常並應用於springboot的異常處理器。 開始之前我先把這個案例的結構大致說明一下: 1、使用idea建立一個springboot的Gradle/Maven專案,引入we

    Python Flask,捕獲異常,捕獲404錯誤,errorhandler(),定義異常處理函式

      demo.py(捕獲異常,自定義異常處理函式): # coding:utf-8 from flask import Flask app = Flask(__name__) # 捕獲404異常錯誤 @app.errorhandler(404) # 當發生404錯誤時,會被

    JAVA基礎作業練習—定義異常之模擬ATM

    package homework; import java.util.InputMismatchException; import java.util.Scanner; class Atm { private double banlance; double num; private String I

    Java 異常處理定義異常處理

    異常處理分為兩種: 1、系統異常處理 2、自定義異常處理 下面分別來講解小編對這個的理解 1、系統異常處理 public class Abnormal { public static void main(String args[]) { P

    Java實驗定義異常處理

    編寫程式,任意輸入一學生的成績,用自定義異常處理所輸入的成績是否小於0或大於100,並在程式中進行異常處理,若沒異常直接輸出該學生的成績。import java.util.Scanner; class Myexption extends Exception { priva

    Spring MVC 全域性異常處理-RESTAPI介面返回統一JSON格式-定義異常處理--404異常捕捉

    寫之前大概兩週草草的將一些程式碼儲存在草稿箱,今天有空來看,結果都沒有了【怨念】—重新整理一下了 —–【轉載請標註出處】 第一部分:需求 第二部分:實現方式 第三部分:404異常捕捉不能實現分析 第四部分:原因和原始碼分析 第五部分:最終總結 需求

    springmvc 定義異常處理

    springmvc利用HandlerExceptionResolver處理程式的異常,包括處理對映對映異常,資料繫結,處理器執行過程中發生的異常 public interface HandlerExceptionResolver { ModelAnd

    ASP.NET MVC中的統一化定義異常處理

    當ASP.NET MVC程式出現了異常,怎麼處理更加規範? 1. 最簡單的方法是設定<customErrors/>節點 <customErrors>節點用於定義一些自定義錯誤資訊的資訊。此節點有Mode和defaultRedirect兩個屬性,其中d

    定義異常處理

    code col class ini print exce 自定義 exc int class MyExcept(Exception): def __init__(self, msg): self.message = msg def __