点击上方“dotNET全栈开发”,“设为星标”

加“星标”,每天11.50,好文必达

全文约1600字,预计阅读时间3分钟

这个n到底是多少年?宇宙第一开发IDE Visual Studio的调试功能非常强大,平常工作debug帮助我们解决不少问题。今天分享两个异常捕获的技巧,希望能够帮助解决一些问题。以下两种情况,我相信大家都会遇到过。

  • 1.没有使用Try-Catch语句,当异常发生的时候,能够自动跳转到异常发生的地方,在使用Try-Catch捕获异常的时候,直接跳转到Catch语句的位置,并不会自动定位到异常代码的位置。

  • 2.使用Try-Catch的时候,多层方法调用时,并不能直接查看到异常代码的位置。

技巧1:自动定位到异常代码位置

针对问题1,我们最想要的结果是,哪里有代码出现错误了,就直接定位到哪儿,异常出在哪行代码上,我一眼就能看得出,这样就能更快地处理问题了。对于问题1,所出现的这种情况,简单复现一下一个空引用的异常

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模式下,会跳转到catch语句这里。你可能觉得这挺简单的......可实际实际工作中,你的一个方法中仅仅只这一个对象吗?在实际工作中可能不止random一个对象,代码复杂,对象够多,几十个也有,我们就很难定位到异常出错的代码了。StackTrace可以定位到那个函数调用错了,并不能定位到哪一行代码出错了。为了解决这个行为可以通过在Visual Studio中菜单栏中的调试》窗口》异常设置中去配置。如下图所示:勾选上Common Language Runtime Exceptions下列的异常单选框。有点多,以前的设置有些变化。现在我们再看之前的代码,使用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 姿势

还是之前的一个方法,我已经将异常设置回复默认了。

        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行。可实际工作中的情况并不是这样简单,基本上是A方法调用B方法,B方法调用C方法,代码如下所示:在Main方法中调用ThrowNullReferrence(),方法ThrowNullReferrence中调用SetNullReferrence()。代码变复杂后,一层嵌套一层。这个时候能正确显示出代码异常的位置吗?

        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: 未将对象引用设置到对象的实例。在 ExceptionSample.Program.SetNullReferrence() 位置 D:\Learn\延迟加载\LinqLayzLoad\LinqLayzLoad\Program.cs:行号 39System.NullReferenceException: 未将对象引用设置到对象的实例。在 ExceptionSample.Program.SetNullReferrence() 位置 D:\Learn\延迟加载\LinqLayzLoad\LinqLayzLoad\Program.cs:行号 44 在 ExceptionSample.Program.ThrowNullReferrence() 位置 D:\Learn\延迟加载\LinqLayzLoad\LinqLayzLoad\Program.cs:行号 27System.NullReferenceException: 未将对象引用设置到对象的实例。在 ExceptionSample.Program.ThrowNullReferrence() 位置 D:\Learn\延迟加载\LinqLayzLoad\LinqLayzLoad\Program.cs:行号 32 在 ExceptionSample.Program.Main(String[] args) 位置 D:\Learn\延迟加载\LinqLayzLoad\LinqLayzLoad\Program.cs:行号 15

错误代码的位置在39行,以上出现异常的地方都是throw的位置。原因呢?catch捕获完后,如果要向上抛出,应该重新实例化一个新的异常对象,再向上抛出,这个最外层方法catch到的才是完整的异常,当然也包括完整的堆栈信息,这样才能定位到异常代码的位置。要使用 throw new Exception 改造后的例子如图,精准定位到 39行的空引用异常Console.WriteLine(random.Next());

结语

分享之前看到的一个老程序员的经验之谈:“多coding,少debug”, 回到标题为什么说"使用Vistual Studio n年",这个n到底指的是多少年。我的意思是可能有些东西,即使使用多年,可能不知道这两个技巧。

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

  1. Windows Server AppFabric Beta 2 for For Vistual Studio 2010已经发布

    Windows Server AppFabric Beta 2 For Vistual Studio 2010/.NET Framework 4.0已经发布了,参看EndPonit上的博客文章http ...

  2. Vistual Studio Community 2017 30天许可证过期

    内网Vistual Studio Community2017的30天许可证到期的解决方案 一.说明 因公司工作保密协议,工作内网电脑无法连接internet,但配有一台上网机,且内网电脑可访问外网电脑 ...

  3. 【技巧】vistual studio 2017 communty 版本许可证过期解决办法

    过期原因: vistual studio 2017有新的版本需要进行更新. 解决方法:(亲测有效) 1.在电脑中搜索并打开 vistual studio installer,此时软件会显示需要更新,点 ...

  4. Vistual Studio Code中Markdown使用数学公式

      Vistual Studio Code天生支持Markdown编译,文件后缀为md即可,但是不支持数学公式,其实在文件开头加上以下代码即可,会自动获得MathJax的脚本支持.MathJax语法可 ...

  5. code-server在线ide(vistual studio code web online)简介

    code-server在线ide(vistual studio code web online)简介 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:12 ...

  6. VS+Qt — Vistual Studio 2022+Qt6安装教程以及解决Qt Vistual Studio Tools下载慢和VS无法打开.ui进行设计的问题

    目录 Vistual Studio 2022下载 Qt下载 Qt Vistual Studio Tools下载 方法1 方法2 方法3 方法4 Vistual Studio 2022配置Qt6 创建Q ...

  7. 推荐一个网站异常检测工具

    推荐一个网站异常检测工具,可每天定时检测网站是否中木马等异常修改行为 工具链接:https://www.lmcjl.com/index/graburl/inspect?menu_id=64&p ...

  8. Android Studio执行出现“应用程序安装异常(-15)

    Android Studio执行出现"应用程序安装异常(-15) gradle.propeities文件,在最底下加入: android.injected.testOnly=false 我的 ...

  9. obs studio 编译摄像头源,即视频捕获设备,可以从添加源中找到并使用它

    obs studio 编译摄像头源,即视频捕获设备,可以从添加源中找到并使用它 - 下载源码 git clone https://github.com/obsproject/libdshowcaptu ...

最新文章

  1. Ubuntu系统执行shell 脚本的方法
  2. Linux下getopt_long函数的使用
  3. 【2021年度训练联盟热身训练赛第二场】Soccer Standings(python)
  4. jdbc oracle thin@localhost 1521 XE
  5. 【Java】欧拉回路的判定
  6. 低脂肪肉能帮你减肥吗?
  7. python能做什么程序-Python可以被用来做哪些神奇好玩的事情
  8. 使用git遇到的问题汇总
  9. Pycharm主题,彩虹猫进度条,翻译插件
  10. Unity移动平台相关(一)
  11. Noi 十连测 Zbox loves meizi
  12. NLP工具——doccano标注系统自动标注功能使用
  13. 如何通过自媒体创业月入万元
  14. ei会议论文含金量高吗?
  15. 你既言而无信,我即出尔反尔
  16. 将当前容器保存为本地镜像
  17. hqyj-IO-day2
  18. 【2019-游记】中山纪念中学暑期游Day6
  19. Java遍历HashSet为什么输出是有序的?
  20. 2018深圳国际3D打印产业展览会

热门文章

  1. html邮箱地址的正则表达式,javascript写一个校验邮箱的正则表达式
  2. geek_Ask How-To Geek:营救受感染的PC,安装无膨胀iTunes和驯服疯狂的触控板
  3. roku能不能安装软件_如何阻止假期更改Roku主题
  4. 100亿人口会挨饿吗?人工智能迎击全球粮食问题
  5. 使用RxJava从多个数据源获取数据
  6. vim-snipmate编写snippet的语法
  7. PHP中 对象自动调用的方法:__set()、__get()、__tostring()
  8. 【CSS基础】实现 div 里的内容垂直水平居中
  9. IKVM 编程武林之.NET派的北冥神功
  10. 云上“炼”码兵器 GitHub Codespaces