異常處理,究竟是處理什么

“系統中每行代碼,都應該是有意義的,如果一段代碼可有可無,那它就不應該存在。”

9175e3c390756747700d4bebf49d5d86.jpeg

01

內容簡述

異常處理是軟件開發的必備技能,但異常處理,究竟是處理什么?,很多小伙伴并沒有一個清晰的認識,大部分人的認識停留在給代碼加上try/catch就算是異常處理了,至于異常捕獲之后該做什么,并不清楚。本文闡述一下自己對異常處理的思考,希望幫助大家對異常處理有一個清晰的認識,在面對異常處理時,能夠有準確的決策。

02


區分異常和錯誤

首先要區分哪些是異常,哪些是錯誤。

可以預測,可以通過代碼邏輯避免發生的異常,我稱之為“錯誤”。

無法預測,無法通過代碼邏輯避免的異常,我稱之為“異常”。

相信到這里,很多小伙伴心里已經有答案了,比如,平時遇到最多的——空引用異常,應該算是錯誤,這是可以通過代碼邏輯避免的。而真正的異常是無法預料的,比如:網絡中斷、請求超時、堆棧溢出、第三方服務異常…等。

我們區分了異常和錯誤,那么對于屬于錯誤的部分,最佳的處理方案是通過代碼邏輯,盡量控制,避免錯誤的發生,而對于屬于異常的部分,或者遺漏的,沒有控制的錯誤,該如何處理?接下來便是本文的重點。

03


異常處理要做什么

異常處理概括起來要做三件事:

1.記錄異常日志

記錄異常日志是為了后續排查,定位,解決異常問題,需要記錄的信息包括:

異常發生時間,異常代碼位置,以及異常時上下文信息(參數),當前操作人等;

如果是Web請求,還要記錄請求的IP地址,URL,客戶端設備信息;

如果是SOA或微服務架構,還要記錄調用鏈路標識TraceID。

記錄異常信息的原則是:幫助開發人員還原異常現場,快速定位異常原因,以便盡快修復。

2.確保非托管資源的關閉和釋放

包括:數據庫鏈接,IO流,等非托管資源的處理,在發生異常的情況下,如何正確關閉鏈接,釋放資源,是需要重點考慮的。

推薦使用 using?語句聲明非托管資源,而不是用try/catch,可以查看我之前的文章?C# using()的本質

3.處理異常后續業務邏輯

主要是業務處理邏輯中事先規劃的異常發生后的處理邏輯,比如:

某個服務接口請求超時后進行重試;

某個功能操作失敗后,切換到備選方案(降級)或觸發補償事件;

在多線程中,當某個子線程異常之后,取消其他相關子線程操作;

自定義異常的處理。

上述情況要根據實際的業務場景決定,如果系統設計時并沒有規劃,也就不需求去處理這部分功能。

04


處理方案

明確了異常處理的三件事,接著看具體方案。

第一件事:記錄異常日志

毫無疑問,應該由全局異常處理組件記錄異常日志,如果框架有全局異常處理功能,就使用框架提供的異常處理功能,如果框架沒有,那就自己開發一個。在Asp.Net中,可以使用ExceptionFilter或自定義中間件實現全局異常處理

第二件事:確保非托管資源關閉和釋放

由上文所說,使用using就好。

第三件事:處理異常后續業務邏輯

視實際業務場景而定,可以在代碼中加try/catch,也可以開發通用的異常處理組件,讓業務邏輯更簡潔清晰。

05


總結

異常處理規范建議:

  1. 通過代碼規范,盡量減少系統中可控的異常(錯誤)發生。

  2. 通過全局異常組件,記錄異常日志,處理通用異常。

  3. 僅在業務邏輯明確需求的情況下,使用try/catch處理異常。

06


成長軌跡

有小伙伴,習慣在每個方法中都加try/catch,卻說不清為何這么做,大概的理由是:程序總難免會報錯,所以要進行try/catch。根本原因在于:對代碼運行機制不夠理解,對自己的代碼沒有信心,以及對異常處理認識的模糊。這些try/catch是不應該出現的,會對代碼簡潔性,可讀性造成污染,與優雅代碼背道而馳。我自己也是從這個階段過來的,也希望小伙伴們不要一直停留在這個階段。

我第一次對異常處理有深刻認知是得到了一位微軟首席架構師的指點,這位架構師是沈征,一位大師級的技術專家,既能講理論,畫架構圖,又能寫出優雅的框架代碼,是我多年職業生涯中遇到的為數不多的大師,他的幾句話足以讓人在迷霧之中看清前方的路,看見遠方的山,看到頭頂的太陽和藍天,再次向大師致敬。

認為內容有價值的話可以點贊,轉發,關注

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282933.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十一篇:(順序)容器的好伴侶 --- 容器適配器

前言 vector容器的數據結構原型是順序表,它很好的實現了順序表的功能,大大方便了編程。好了,現在假設有天我又想用棧,那么有沒有棧對應的容器呢?很遺憾,木有。但基于“棧”可以由順序表或者鏈表實現這一特性…

第一季度ADC市場份額揭榜 A10 Networks再獲用戶青睞

近日,根據全球知名咨詢公司IDC 發布的2018年第一季度中國ADC市場分析報告顯示,A10 Networks 穩占中國ADC市場份額第二名。數據來源:IDC 2018年Q1 ADC市場報告 從廠商排名來看依次為 F5 30%, A10Networks 12%, DPtech 12% ,Sangfor 9% &#…

zblog php 標題優化,Zblog分類頁標題重復的優化 - 張力博客

今天瘋子無聊上自己博客看看,點了幾個頁面就發現一個問題。我博客分類頁的標題怎么第一頁和后面的頁數都是一樣的,這一點相信大家都知道對于SEO優化是很不好的一點。我也看了同樣的一些個人zblog博客也存在這樣的問題。于是我在網上就找了關于修改zblog分…

利用linux shell自己主動頂貼

在論壇上面發帖問個什么東西的話,一旦不頂。帖子就秒沉了,可是又實在不想每時每刻都去頂,怎么辦?以下展示了怎樣利用shell 的crontab實現自己主動頂貼。 閑話不多說了,以豆瓣為例—– 1: 用chrome打開豆瓣…

Linux命令之telnet 命令

介紹 Telnet是常用的遠程控制Web服務器的方法 Telnet協議是TCP/IP協議族中的一員,是Internet遠程登陸服務的標準協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到服務器。終端使用者…

深度學習庫 SynapseML for .NET 發布0.1 版本

2021年11月 微軟開源一款簡單的、多語言的、大規模并行的機器學習庫 SynapseML(以前稱為 MMLSpark),以幫助開發人員簡化機器學習管道的創建。具體參見[1]微軟深度學習庫 SynapseML:可直接在系統中嵌入 45 種不同機器學習服務、支持…

Buildroot stress-ng Linux系統壓力測試

/*********************************************************************** Buildroot stress-ng Linux系統壓力測試* 說明:* 之前有使用lmbench對整板進行一些測試,如果相對某一部分專門進行測試,* 就可以參考使用stree-ng…

支持回調處理 php函數,PHP支持回調的函數有哪些?

PHP支持回調的函數有:1、匿名函數,代碼為【$server->on Request】;2、類靜態方法,代碼為【static function test $req】;3、函數,代碼為【my_onRequest $req】。PHP支持回調的函數有:1、匿名…

病毒木馬查殺實戰第019篇:病毒特征碼查殺之編程實現

前言上次我們已經簡介過了病毒特征碼提取的基本方法,那么這次我們就通過編程來實現對于病毒的特征碼查殺。定義特征碼存儲結構為了簡單起見。這次我們使用的是setup.exe以及unpacked.exe這兩個病毒樣本。經過上次的分析,我們對setup.exe樣本的特征碼提取…

《ASP.NET Core 6框架揭秘》實例演示[22]:如何承載你的后臺服務[補充]

借助 .NET提供的服務承載(Hosting)系統,我們可以將一個或者多個長時間運行的后臺服務寄宿或者承載我們創建的應用中。任何需要在后臺長時間運行的操作都可以定義成標準化的服務并利用該系統來承載,ASP.NET Core應用最終也體現為這…

命令行打印文件樹列表: tree

Linux & Mac 1.下載tree lib //mac brew install tree //centos yum install tree //ubuntu apt-get install tree 用法 //顯示所有文件 tree //顯示深度2層 tree -L 2 2. 命令find組合 find . -print | sed -e s;[^/]*/;|____;g;s;____|; |;g > structure.txt 移除node…

java 二分法查找數組,Java二分法查找數組元素下標

package pers.ly.javase.algorithm;import java.util.Arrays;/*** 二分法查找* author: Lu Yang* date: 2019-01-23 10:50:37**/public class BinarySearch {public static void main(String[] args) {Integer[] arr {10,50,30,40,10,80,90,70,60,40,100,10};// 數組排序 ->…

ASP.NET Core MVC壓縮樣式、腳本及總是復制文件到輸出目錄

前言 在.NET Core之前對于壓縮樣式文件和腳本我們可能需要借助第三方工具來進行壓縮,但在ASP.NET MVC Core中則無需借助第三方工具來完成,本節我們來看看ASP.NET Core MVC為我們提供了哪些方便。 自動壓縮樣式和腳本 當我們在測試環境中肯定不需要壓縮腳…

京東訂單自動評價方法

剛剛完成的一個京東自動訂單腳本, 以后還要加入其它京東自動的腳本項目地址: https://github.com/mm333444/aox_jd_auto_script 京東自動完成腳本 目前只完成京東訂單自動評價, 評價時會自動上傳商品圖片 一、安裝 1. 程序依賴 python3.52. 安裝配置 安裝pipenv安裝模塊 pipenv…

matlab空間散點擬合曲線,matlab離散點擬合曲線

matlab曲線擬合與數值點標注實例_工程科技_專業資料。實例 1: 現已知兩組...Matlab教程 曲線擬合工具箱 數學科學與技術學院 胡金燕 lionfr 曲線擬合定義 在實際工程應用和科學實踐中,經常需要尋求 兩個(或多個)變量間的關系,而......(p,x); %獲得x點處對相應的y值 plot(x,y,r*…

redis下并發問題解決方案

http://effective.blog.51cto.com/8296150/1671743 現在的計算機大都是多核的cpu,意味著可以并行執行多個進程.如果這多個運行的進程對同一份數據進行讀寫操作,那么就有可能出現兩個或者多個進程讀到的都是老的數據,這種情況下,再進行寫入操作之后就會有一些進程寫入的數據被覆…

宜建立自主可控的車用芯片和操作系統技術體系

萬物互聯時代,操作系統的邊界在不斷突破,面向“人機物”融合的泛在計算場景,能夠支撐分布式人機物協同應用的操作系統將是產業未來之光。操作系統在經過主機時代、PC互聯時代、移動互聯時代之后,來到萬物互聯時代,這恰…

Java 9進入第一輪問題修復階段

Java 9功能特性正式完成,這意味著第一個問題修復階段已經開始。HTTP/2客戶端沒有在截止日期前完成,現已降級為孵化器功能。由于現在的目標是在7月準備好可發布的Java 9,所以目前不太可能添加任何新的JEP。\\InfoQ此前的報道中提到&#xff0c…

django 用戶管理(1)

編輯了前端的頁面展示,用的bootstrap 用戶登錄 用戶信息 用戶編輯 創建用戶 修改密碼 轉載于:https://blog.51cto.com/jacksoner/2133129

qiaoye.php,全自動無限生成關鍵詞頁面(黑帽SEO優化終極方法)

如果你是做黑帽SEO的,如果你還停留在用欄目、租域名、劫持等手段來做黑帽SEO優化,我可以肯定的告訴你,你做的再好,也賺不了多少。那么今天咱們要說的就是無限生成關鍵詞頁面用內容頁來做黑帽SEO優化。這是我在演示的時候做的一個站…