电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java全局異常處理器實(shí)現(xiàn)過程解析

瀏覽:35日期:2022-09-05 11:18:47

前言

最近稍微閑了一點(diǎn)于是把這個(gè)半年都沒更新的開源項(xiàng)目 cicada 重新?lián)炝似饋怼?/p>

一些新關(guān)注的朋友應(yīng)該還不知道這項(xiàng)目是干啥的?先來看看官方介紹吧(其實(shí)就我自己寫的😀)

cicada: 基于 Netty4 實(shí)現(xiàn)的快速、輕量級 WEB 框架;沒有過多的依賴,核心 jar 包僅 30KB。

Java全局異常處理器實(shí)現(xiàn)過程解析

效果

廣告打完了,回到正題;大家平時(shí)最常用的 MVC 框架當(dāng)屬 SpringMVC 了,而在搭建腳手架的時(shí)候相信全局異常處理是必不可少的。

Spring 用法

通常我們的做法如下:

傳統(tǒng) Spring 版本:

實(shí)現(xiàn)一個(gè) Spring 自帶的接口,重寫其中的方法,最后的異常處理便在此處。將這個(gè)類配置在 Spring 的 xml ,當(dāng)做一個(gè) bean 注冊到 Spring 容器中。

public class CustomExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //自定義處理}

<bean class='ssm.exception.CustomExceptionResolver'></bean>

當(dāng)然現(xiàn)在流行的 SpringBoot 也有對應(yīng)的簡化版本:

@ControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) public Object defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { //自定義處理 }}

全部都換為注解形式,但本質(zhì)上還是一樣的。

都是要在容器中創(chuàng)建一個(gè)特殊的 bean,這個(gè) bean 專門用于處理異常,當(dāng)系統(tǒng)運(yùn)行時(shí)出現(xiàn)異常,就從容器中找到該 bean,并執(zhí)行其中的方法即可。

至于這個(gè)特殊的 bean 如何標(biāo)識出來,無非就是實(shí)現(xiàn)某個(gè)特定接口或者用注解聲明,也就對應(yīng)了傳統(tǒng) Spring 和 SpringBoot 的用法。

cicada 用法

cicada 在設(shè)計(jì)自己的全局異常處理器時(shí)也參考了 Spring 的相關(guān)設(shè)計(jì),所以最終用法如下:

@CicadaBeanpublic class ExceptionHandle implements GlobalHandelException { private final static Logger LOGGER = LoggerBuilder.getLogger(ExceptionHandle.class); @Override public void resolveException(CicadaContext context, Exception e) { LOGGER.error('Exception', e); WorkRes workRes = new WorkRes(); workRes.setCode('500'); workRes.setMessage(e.getClass().getName() + '系統(tǒng)運(yùn)行出現(xiàn)異常'); context.json(workRes); }}

自定義一個(gè)實(shí)現(xiàn)了 GlobalHandelException 接口的類,當(dāng)請求出現(xiàn)異常時(shí),頁面和后臺將會(huì)如下輸出:

Java全局異常處理器實(shí)現(xiàn)過程解析Java全局異常處理器實(shí)現(xiàn)過程解析

設(shè)計(jì)

看得出用法和 Spring 非常類似,也是需要實(shí)現(xiàn)一個(gè)接口 GlobalHandelException,同時(shí)使用 @CicadaBean 注解該類將他加載到 cicada 內(nèi)置的 IOC 容器內(nèi)。

當(dāng)出現(xiàn)異常時(shí)則在這個(gè) IOC 容器中找到該對象調(diào)用它的 resolveException 即可。

其中還可以通過 CicadaContext 全局上下文響應(yīng)不同的輸出(json/text/html)。

核心原理

Java全局異常處理器實(shí)現(xiàn)過程解析

簡單畫了下流程圖,步驟如下:

初始化時(shí)會(huì)找到實(shí)現(xiàn)了 GlobalHandelException 接口的類,將它實(shí)例化并注冊到 IOC 容器中。當(dāng)發(fā)生異常時(shí)從容器中獲取到異常處理器的對象,執(zhí)行其中的處理函數(shù)即可。

說了半天原理來看看源碼是如何實(shí)現(xiàn)的。

Java全局異常處理器實(shí)現(xiàn)過程解析

在初始化 bean 時(shí),如果是一個(gè)異常處理器則會(huì)將他單獨(dú)存放(也就相當(dāng)于前文說的打標(biāo)識)。

其中的 GlobalHandelException 本身的定義也非常簡單:

Java全局異常處理器實(shí)現(xiàn)過程解析

接下來是運(yùn)行時(shí):

Java全局異常處理器實(shí)現(xiàn)過程解析Java全局異常處理器實(shí)現(xiàn)過程解析Java全局異常處理器實(shí)現(xiàn)過程解析

而當(dāng)出現(xiàn)異常時(shí)則會(huì)通過之前的保存的異常處理 bean 進(jìn)行異常處理,在調(diào)用的同時(shí)將全局上下文及異常信息傳遞過去就齊活了。

這樣就可以在這個(gè)實(shí)現(xiàn)類中實(shí)現(xiàn)我們自己的異常處理邏輯了。

總結(jié)

萬一今后面試官問你們 SpringMVC 的異常處理是如何實(shí)現(xiàn)的?你該知道怎么回答了吧😏。

同時(shí)也可以發(fā)散一下,是否可以配置一個(gè)針對于某一個(gè) controller 的異常處理,這樣每個(gè) controller 產(chǎn)生的異常可以單獨(dú)處理,如果沒有配置則進(jìn)入全局異常;原理也差不多,感興趣的朋友可以提個(gè) PR 完成該 feature。

項(xiàng)目源碼:

https://github.com/TogetherOS/cicada

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 粉丝机械,粉丝烘干机,粉丝生产线-招远市远东粉丝机械有限公司 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 聚合甘油__盐城市飞龙油脂有限公司| 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | hc22_hc22价格_hc22哈氏合金—东锜特殊钢 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 光环国际-新三板公司_股票代码:838504 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | 找培训机构_找学习课程_励普教育 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 深圳南财多媒体有限公司介绍 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 富森高压水枪-柴油驱动-养殖场高压清洗机-山东龙腾环保科技有限公司 | 玻璃钢型材_拉挤模具_玻璃钢拉挤设备——滑县康百思 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 郑州宣传片拍摄-TVC广告片拍摄-微电影短视频制作-河南优柿文化传媒有限公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 小型手持气象站-空气负氧离子监测站-多要素微气象传感器-山东天合环境科技有限公司 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 东莞市超赞电子科技有限公司 全系列直插/贴片铝电解电容,电解电容,电容器 |