日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Vistual Studio N年,推荐2个异常捕获的技巧

發(fā)布時間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Vistual Studio N年,推荐2个异常捕获的技巧 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“dotNET全棧開發(fā)”,“設(shè)為星標(biāo)”

加“星標(biāo)”,每天11.50,好文必達

全文約1600字,預(yù)計閱讀時間3分鐘

這個n到底是多少年?宇宙第一開發(fā)IDE Visual Studio的調(diào)試功能非常強大,平常工作debug幫助我們解決不少問題。今天分享兩個異常捕獲的技巧,希望能夠幫助解決一些問題。以下兩種情況,我相信大家都會遇到過。

  • 1.沒有使用Try-Catch語句,當(dāng)異常發(fā)生的時候,能夠自動跳轉(zhuǎn)到異常發(fā)生的地方,在使用Try-Catch捕獲異常的時候,直接跳轉(zhuǎn)到Catch語句的位置,并不會自動定位到異常代碼的位置。

  • 2.使用Try-Catch的時候,多層方法調(diào)用時,并不能直接查看到異常代碼的位置。

技巧1:自動定位到異常代碼位置

針對問題1,我們最想要的結(jié)果是,哪里有代碼出現(xiàn)錯誤了,就直接定位到哪兒,異常出在哪行代碼上,我一眼就能看得出,這樣就能更快地處理問題了。對于問題1,所出現(xiàn)的這種情況,簡單復(fù)現(xiàn)一下一個空引用的異常

namespace ExceptionSample {class Program{static void Main(string[] args){try{Random random = null;Console.WriteLine(random.Next());}catch (Exception ex){Console.WriteLine(ex);}Console.ReadLine();}} }

上面的異常代碼NullReferrenceException,Debug模式下,會跳轉(zhuǎn)到catch語句這里。你可能覺得這挺簡單的......可實際實際工作中,你的一個方法中僅僅只這一個對象嗎?在實際工作中可能不止random一個對象,代碼復(fù)雜,對象夠多,幾十個也有,我們就很難定位到異常出錯的代碼了。StackTrace可以定位到那個函數(shù)調(diào)用錯了,并不能定位到哪一行代碼出錯了。為了解決這個行為可以通過在Visual Studio中菜單欄中的調(diào)試》窗口》異常設(shè)置中去配置。如下圖所示:勾選上Common Language Runtime Exceptions下列的異常單選框。有點多,以前的設(shè)置有些變化。現(xiàn)在我們再看之前的代碼,使用Try-Catch語句捕獲異常的時候,就會直接定位到異常代碼的位置了,如下圖示:

static void Main(string[] args){try{Random random = null;Random random1 = new Random();Random random2 = new Random();Random random3 = new Random();Console.WriteLine(random1.Next());Console.WriteLine(random2.Next());Console.WriteLine(random3.Next());Console.WriteLine(random.Next());}catch (Exception ex){Console.WriteLine(ex);}Console.ReadLine();} 在這里插入圖片描述

技巧2:正常的throw 姿勢

還是之前的一個方法,我已經(jīng)將異常設(shè)置回復(fù)默認(rèn)了。

static void Main(string[] args){try{Random random = null;Console.WriteLine(random.Next());}catch (Exception ex){System.Diagnostics.Debug.Write(ex);throw ex;}}

我們再輸出中可以看到(ps:項目名稱用的之前的,不介意哈)錯誤的代碼在16行??蓪嶋H工作中的情況并不是這樣簡單,基本上是A方法調(diào)用B方法,B方法調(diào)用C方法,代碼如下所示:在Main方法中調(diào)用ThrowNullReferrence(),方法ThrowNullReferrence中調(diào)用SetNullReferrence()。代碼變復(fù)雜后,一層嵌套一層。這個時候能正確顯示出代碼異常的位置嗎?

static void Main(string[] args){try{ThrowNullReferrence();}catch (Exception ex){System.Diagnostics.Debug.Write(ex);throw ex;}}public static void ThrowNullReferrence(){try{SetNullReferrence();}catch (Exception ex){System.Diagnostics.Debug.Write(ex);throw ex;}}public static void SetNullReferrence(){try {Random random = null;Console.WriteLine(random.Next());}catch(Exception ex){System.Diagnostics.Debug.Write(ex);throw ex;}}

我們可以通過下圖看到:System.NullReferenceException: 未將對象引用設(shè)置到對象的實例。在 ExceptionSample.Program.SetNullReferrence() 位置 D:\Learn\延遲加載\LinqLayzLoad\LinqLayzLoad\Program.cs:行號 39System.NullReferenceException: 未將對象引用設(shè)置到對象的實例。在 ExceptionSample.Program.SetNullReferrence() 位置 D:\Learn\延遲加載\LinqLayzLoad\LinqLayzLoad\Program.cs:行號 44 在 ExceptionSample.Program.ThrowNullReferrence() 位置 D:\Learn\延遲加載\LinqLayzLoad\LinqLayzLoad\Program.cs:行號 27System.NullReferenceException: 未將對象引用設(shè)置到對象的實例。在 ExceptionSample.Program.ThrowNullReferrence() 位置 D:\Learn\延遲加載\LinqLayzLoad\LinqLayzLoad\Program.cs:行號 32 在 ExceptionSample.Program.Main(String[] args) 位置 D:\Learn\延遲加載\LinqLayzLoad\LinqLayzLoad\Program.cs:行號 15

錯誤代碼的位置在39行,以上出現(xiàn)異常的地方都是throw的位置。原因呢?catch捕獲完后,如果要向上拋出,應(yīng)該重新實例化一個新的異常對象,再向上拋出,這個最外層方法catch到的才是完整的異常,當(dāng)然也包括完整的堆棧信息,這樣才能定位到異常代碼的位置。要使用 throw new Exception 改造后的例子如圖,精準(zhǔn)定位到 39行的空引用異常Console.WriteLine(random.Next());

結(jié)語

分享之前看到的一個老程序員的經(jīng)驗之談:“多coding,少debug”, 回到標(biāo)題為什么說"使用Vistual Studio n年",這個n到底指的是多少年。我的意思是可能有些東西,即使使用多年,可能不知道這兩個技巧。

總結(jié)

以上是生活随笔為你收集整理的使用Vistual Studio N年,推荐2个异常捕获的技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。