前端try catch是如何捕获异常的_Try-Catch无法正确定位异常位置,我推荐2个有效技巧...
宇宙第一开发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个有效技巧...相关推荐
- java try catch嵌套_try catch里面try catch嵌套
try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...
- 前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?
前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人. 一.为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的 ...
- cstring越界_try catch 捕捉数组越界异常
各位大牛,小弟又碰到问题了,捕捉数据越界异常,本人的代码是这样的 int func1() { char a[8] = { 0 }; a[10] = "9"; //此处数组越界 re ...
- php错误没有进入catch,php – 致命错误:没有try / catch块的未捕获异常
我正在尝试在表单字段为空时以及插入查询不成功时抛出异常.我已经看到有人在不使用try / catch块而不包含Exceptions类之前抛出异常.有谁知道我会怎么做? 当我没有填写所有字段时,这是我得 ...
- vs开发,添加try catch(...)发现没有捕获异常,需要对编译命令进行设置
最近处理底层收到数据,发现很多异常数据导致程序崩溃,很多是之前开发者没有考虑到异常情况导致,想使用try catch抛出发现没起作用,经过搜索资料发现需要在编译命令行进行修改 方法如下: 要解决这个问 ...
- scala中捕获异常_如何在Scala中引发异常?
scala中捕获异常 Scala的例外 (Exceptions in Scala) Exceptions are cases or events that occur in the program a ...
- java捕获异常和抛出异常_Java捕获多个异常,重新抛出异常
java捕获异常和抛出异常 In Java 7, catch block has been improved to handle multiple exceptions in a single cat ...
- java try catch嵌套_解析Java中未被捕获的异常以及try语句的嵌套使用
Java未被捕获的异常 在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public st ...
- php catch e是什么,php try catch 中的catch(Exception $e) 中的Exception 有什么作用?
如题. Exception 是起作用域的作用吗?还是语言结构? 首先很明确的是 try - catch - 是一个语言结构. 那既然如此就不能用函数参数类型限定的方式去理解 catch 后面的括号里的 ...
- java catch中 return_JAVA中try、catch、finally带return的执行顺序总结
try catch 以后只要没有抛出新异常或者return,代码会继续往下执行的. 异常处理中,try.catch.finally的执行顺序,大家都知道是按顺序执行的.即,如果try中没有异常,则顺 ...
最新文章
- 如何判断CPU、内存、磁盘的性能瓶颈?
- 图像分割20年,盘点影响力最大的10篇论文
- Nginx反向绑定域名方法和详细操作应用实例:Google和Gravatar
- ubuntu安装vmware(支持mac)与卸载
- python中文意思k-Python中_,__,__xx__的区别
- 数据结构和算法之单链表
- RestTemplate.getForObject返回List的时候处理方式
- 动态修改EasyUI accordion选中面板的标题(title)
- Skyline软件二次开发初级——11如何在WEB页面中的三维地图上加载和保存工程文件...
- 计算机程序员求职信英语作文,电脑程序员英文求职信
- [Bilingual]Klein四元群的四个例子Four examples of Klein four-group
- 电子邮件群发软件,邮件群发单显是什么意思?外贸群发邮件软件
- 无线USB网卡Rndis设备
- Windows10 安装程序无法继续,因为你的计算机上安装了更新的Internet Explore版本
- hive:函数:日期比较函数:获取当前日期 + date_add + date_sub函数获取前几天或后几天的日期
- mfc连接oracle12c,MFC ADO连接Oracle12c数据库 类库文件
- linux 负载均衡技术之 LVS
- identity和assigned 的区别
- 正则匹配字符串最后一个逗号,不是逗号不匹配
- 23岁那一年,我在做什么