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

点击上方“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到底指的是多少年。我的意思是可能有些东西,即使使用多年,可能不知道这两个技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode动态规划 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n > 1 给你 n &a…

Magicodes.Sms短信库的封装和集成

简介Magicodes.Sms是心莱团队封装的短信服务库,已提供Abp模块的封装。Nuget新的包开始使用如果使用Abp相关模块,则使用起来比较简单,具体您可以参考相关单元测试的编写。主要有以下步骤:1.引用对应的Nuget包如:2.添加模…

LeetCode动态规划 使用最小花费爬楼梯

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。 请…

Magicodes.IE编写多框架版本支持和执行单元测试

背景很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE就出现了以下问题:(GitHub:https://github.com/xin-lai/Magicodes.IE&am…

2019全球AI训练营五地再同发

不觉已过小大寒,虽然天气渐冷,但我们学习的热情却愈加高涨。因为由MVP发起主办的、2019年的全球AI训练营又要在北京、上海、广州、杭州、宁波五个地方同时举办了!去年取得巨大成功的全球活动,今年参与举办的国家地区/城市更是高达…

NLog自定义Layout Renderer

更多精彩内容请关注我们长话短说前文《解剖HttpClientFactory,自由扩展HttpMessageHandler》主要讲如何为HttpClientFactory自定义HttpMessageHandler组件, 现在完成课后的小作业: 将重点日志字段显示到Nlog的Layout Renderer上本文自定义一个NLog Layo…

LeetCode动态规划 跳跃游戏II

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 假设你总是可以到达数组的最后一个位置。 这道题用动态规划做,时间复杂度很高 …

一文了解Nuget的使用

Nuget介绍官网定义:NuGet是.NET的软件包管理器(免费)。NuGet客户端工具提供了生成和使用软件包的能力。NuGet Gallery 是所有软件包作者和消费者都使用的中央软件包存储库。简单来说,nuget包解决了dll引用的问题,开发者…

银行家算法 C++实现

操作系统模拟之银行家算法。 文件共4份&#xff0c;其中1份cpp&#xff0c;3份.h&#xff0c;代码如下&#xff1a; main.cpp #include <iostream> #include <stdlib.h> #include "initialize.h" #include "check.h" #include "apply.h…

.NET 应用程序支持直接调用 WebAssembly 模块

WebAssembly Runtime 现已添加 .NET Core API&#xff0c;开发者可直接在 .NET 应用程序中调用 WebAssembly 模块。Mozilla 宣布由 Bytecode Alliance 创建的 Wasmtime&#xff08;WebAssembly runtime&#xff09;现已添加处于早期预览版状态的 .NET Core API&#xff0c;这就…

进程调度算法 C++实现

操作系统模拟之进程调度算法。 文件共2份&#xff0c;其中1份cpp&#xff0c;1份.h&#xff0c;代码如下&#xff1a; main.cpp #include "init.h"int main() {printf("欢迎进入演示系统&#xff01;\n");printf("\n现在需要对进程数据初始化\n&quo…

《RPA、AI、.NET Core 与未来》-中国.NET开发者峰会

未 来第四次工业革命&#xff0c;催生了数字自动化劳动&#xff0c;RPA 与 AI 技术的融合&#xff0c;成为智能信息社会的重要环节。当下RPA平台主要采用.NET Framework框架&#xff0c;也限制了 RPA 只用于 Windows 平台。.NET Core 的开放与跨平台特性赋予RPA更大发展空间。…

地址转换算法 C++实现

操作系统模拟之地址转换算法。 文件共3份&#xff0c;其中1份cpp&#xff0c;2份.h&#xff0c;代码如下&#xff1a; main.cpp #include "init.h"int main() {printf("欢迎进入演示系统&#xff01;\n");printf("\n现在需要对进程数据初始化\n&quo…

浅议gRPC的数据传输机制和回调机制

本文来自DotNET技术圈作者&#xff1a;溪源一、引子如您所知&#xff0c;gRPC是目前比较常见的rpc框架&#xff0c;可以方便的作为服务与服务之间的通信基础设施&#xff0c;为构建微服务体系提供非常强有力的支持。而基于.NET Core的gRPC.NET 组件截至2019年11月30日的最新版本…

请求分页算法 Python实现

操作系统模拟之请求分页算法。 文件共1份&#xff0c;代码如下&#xff1a; import math import os import random import copydef alo_opt():print("您选择了OPT算法&#xff0c;执行结果如下&#xff1a;")print("访问页面 物理块 缺页中断")temp_que…

如何在 Visual Studio 2019 中连接中国版 Azure

点击上方蓝字关注“汪宇杰博客”导语做国内项目很可能用到中国版的 Azure&#xff0c;即世纪互联运营的 azure.cn。然而 Visual Studio 2019 默认连接的是国际版的 Azure&#xff0c;如何添加中国版订阅呢&#xff1f;差点9966年前我曾经写过一篇《图解&#xff1a;如何在Visua…

磁盘寻道算法 Python实现

操作系统模拟之磁盘寻道算法。 文件共1份&#xff0c;代码如下&#xff1a; import math import random import copydef alo_fcfs():print("您选择了FCFS算法&#xff0c;执行结果如下&#xff1a;")print("当前磁道号 下一磁道号 绝对差")print({:6d}{:1…

k8s 使用 Init Container 确保依赖的服务已经启动

k8s 使用 Init Container 确保依赖的服务已经启动Intro最近 helm 3 正式发布了&#xff0c;dotnetcore 3.1 也正式发布了&#xff0c;最近打算把我的活动室预约项目做一个升级&#xff0c;项目已经升级到了 dotnetcore 3.1&#xff0c;最近几天则在准备把项目打包一个 helm 包&…

LeetCode动态规划 最大子序和

给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 ps&#xff1a; 清华大学912曾经考过。 状态转移方程 dp[i] max(nums[i], dp[i-1] nums[i]) 边界条件 dp[0] nums[0] 代码…

dotNET面试题汇总系列连载(1):基础语法

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约4000字&#xff0c;预计阅读时间8分钟马上要到2020年了&#xff0c;这里整理一个.NET 工程师面试题系列&#xff0c;希望年底或者明年金三银四跳槽的程序猿们带…