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

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

结语

分享之前看到的一个老程序员的经验之谈:“多coding,少debug”

前端try catch是如何捕获异常的_Try-Catch无法正确定位异常位置,我推荐2个有效技巧...相关推荐

  1. java try catch嵌套_try catch里面try catch嵌套

    try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...

  2. 前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?

    前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人. 一.为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的 ...

  3. cstring越界_try catch 捕捉数组越界异常

    各位大牛,小弟又碰到问题了,捕捉数据越界异常,本人的代码是这样的 int func1() { char a[8] = { 0 }; a[10] = "9"; //此处数组越界 re ...

  4. php错误没有进入catch,php – 致命错误:没有try / catch块的未捕获异常

    我正在尝试在表单字段为空时以及插入查询不成功时抛出异常.我已经看到有人在不使用try / catch块而不包含Exceptions类之前抛出异常.有谁知道我会怎么做? 当我没有填写所有字段时,这是我得 ...

  5. vs开发,添加try catch(...)发现没有捕获异常,需要对编译命令进行设置

    最近处理底层收到数据,发现很多异常数据导致程序崩溃,很多是之前开发者没有考虑到异常情况导致,想使用try catch抛出发现没起作用,经过搜索资料发现需要在编译命令行进行修改 方法如下: 要解决这个问 ...

  6. scala中捕获异常_如何在Scala中引发异常?

    scala中捕获异常 Scala的例外 (Exceptions in Scala) Exceptions are cases or events that occur in the program a ...

  7. java捕获异常和抛出异常_Java捕获多个异常,重新抛出异常

    java捕获异常和抛出异常 In Java 7, catch block has been improved to handle multiple exceptions in a single cat ...

  8. java try catch嵌套_解析Java中未被捕获的异常以及try语句的嵌套使用

    Java未被捕获的异常 在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public st ...

  9. php catch e是什么,php try catch 中的catch(Exception $e) 中的Exception 有什么作用?

    如题. Exception 是起作用域的作用吗?还是语言结构? 首先很明确的是 try - catch - 是一个语言结构. 那既然如此就不能用函数参数类型限定的方式去理解 catch 后面的括号里的 ...

  10. java catch中 return_JAVA中try、catch、finally带return的执行顺序总结

    try catch  以后只要没有抛出新异常或者return,代码会继续往下执行的. 异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的.即,如果try中没有异常,则顺 ...

最新文章

  1. 如何判断CPU、内存、磁盘的性能瓶颈?
  2. 图像分割20年,盘点影响力最大的10篇论文
  3. Nginx反向绑定域名方法和详细操作应用实例:Google和Gravatar
  4. ubuntu安装vmware(支持mac)与卸载
  5. python中文意思k-Python中_,__,__xx__的区别
  6. 数据结构和算法之单链表
  7. RestTemplate.getForObject返回List的时候处理方式
  8. 动态修改EasyUI accordion选中面板的标题(title)
  9. Skyline软件二次开发初级——11如何在WEB页面中的三维地图上加载和保存工程文件...
  10. 计算机程序员求职信英语作文,电脑程序员英文求职信
  11. [Bilingual]Klein四元群的四个例子Four examples of Klein four-group
  12. 电子邮件群发软件,邮件群发单显是什么意思?外贸群发邮件软件
  13. 无线USB网卡Rndis设备
  14. Windows10 安装程序无法继续,因为你的计算机上安装了更新的Internet Explore版本
  15. hive:函数:日期比较函数:获取当前日期 + date_add + date_sub函数获取前几天或后几天的日期
  16. mfc连接oracle12c,MFC ADO连接Oracle12c数据库 类库文件
  17. linux 负载均衡技术之 LVS
  18. identity和assigned 的区别
  19. 正则匹配字符串最后一个逗号,不是逗号不匹配
  20. 23岁那一年,我在做什么

热门文章

  1. 初始化map和list的两种写法
  2. 安装Python readline模块
  3. JavaScript判断浏览器类型及版本(新增IE11)
  4. java web 程序---javaBean
  5. 救急的戴尔Latitude 10商用平板电脑
  6. 9月29日 卷积神经网络的发展历程
  7. HiveSQL解析过程详解
  8. 学习Linux让我进入了知名企业 原
  9. day10 强制类型转换(更新)
  10. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作