电脑软件下载官方网站,微商货源类网站源码,连锁餐饮网站开发背景内容,张槎网站建设点击上方“dotNET全栈开发”#xff0c;“设为星标”加“星标★”#xff0c;每天11.50#xff0c;好文必达全文约1600字#xff0c;预计阅读时间3分钟这个n到底是多少年#xff1f;宇宙第一开发IDE Visual Studio的调试功能非常强大#xff0c;平常工作debug帮助我们解决… 点击上方“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();}}
}
上面的异常代码NullReferrenceExceptionDebug模式下会跳转到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到底指的是多少年。我的意思是可能有些东西即使使用多年可能不知道这两个技巧。