使用代码分析来分析托管代码质量 之 CA2200
vs的代码分析功能:vs菜单 “生成”下面有“对解决方案运行代码分析 Alt+F11”和“对[当前项目]运行代码分析”2个子菜单。
使用这个功能,可以对托管代码运行代码分析,发现代码中的缺陷和潜在问题,据此分析结果我们可以对程序做相应优化调整。
常见的分析类别有:
- Usage---使用冲突
- Security---如不安全的数据访问,sql注入
- Design----设计问题
来看几个代码分析结果。
下面针对分析结果“CA2200 再次引发以保留堆栈详细信息”做个小述。
具体可见msdn:《CA2200: Rethrow to preserve stack details》
当一个异常被抛出时,这个异常通常包含其详细的堆栈跟踪信息。一个完整的堆栈跟踪是方法调用层次结构的列表,从引发该异常的方法开始,一直到捕获到该异常的方法为止。
CA2200是什么?
CA2200可不是国航航班哦~
CA2200是一个规则,这个规则是说,你如果在代码中捕获了某异常,并且在catch里(做相应处理比如记录日志后)又把这个异常实例throw出去重新引发该异常,那么,这种情况下,堆栈跟踪是从throw语句开始的,而不是从引发该异常的原始代码行启动的。这将不利于我们对一些问题的排障。所以,CA2200建议我们,若要保留该异常的原始堆栈跟踪信息,就要在使用 throw 语句时不要指定该异常。
看下面的demo示例:
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using System;
- namespace UsageLibrary
- {
- [TestClass]
- public class TestsRethrow
- {
- [TestMethod]
- public void CatchException()
- {
- try
- {
- CatchAndRethrowExplicitly();
- }
- catch (ArithmeticException e)
- {
- Console.WriteLine("Explicitly specified:{0}{1}",
- Environment.NewLine, e.StackTrace);
- }
- try
- {
- CatchAndRethrowImplicitly();
- }
- catch (ArithmeticException e)
- {
- Console.WriteLine("Implicitly specified:{0}{1}",
- Environment.NewLine, e.StackTrace);
- }
- }
- void CatchAndRethrowExplicitly()
- {
- try
- {
- ThrowException();
- }
- catch (ArithmeticException e)
- {
- // Violates the rule.
- throw e;
- }
- }
- void CatchAndRethrowImplicitly()
- {
- try
- {
- ThrowException();
- }
- catch (ArithmeticException e)
- {
- // Satisfies the rule.
- throw;
- }
- }
- void ThrowException()
- {
- throw new ArithmeticException("illegal expression");
- }
- }
- }
执行代码,运行结果为:
使用代码分析来分析托管代码质量 之 CA2200的更多相关文章
- 打造smali代码库辅助分析
打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...
- Python之路,Day22 - 网站用户访问质量分析监测分析项目开发
Python之路,Day22 - 网站用户访问质量分析监测分析项目开发 做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129 项目实战之 ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析
漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc ...
- [Android6.0][RK3399] 双屏异显代码实现流程分析(一)【转】
本文转载自:http://blog.csdn.net/dearsq/article/details/55049182 Platform: RK3399 OS: Android 6.0 Version: ...
- [Swift通天遁地]七、数据与安全-(15)使用单元测试进行代码的性能分析
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Android核心分析 之一分析方法论探讨之设计意图
为什么要研究Android,是因为它够庞大,它够复杂,他激起了我作为一个程序员的内心的渴望,渴望理解这种复杂性.我研究的对象是作为手机开发平台的Android软件系统部分,而不是Dalvik虚拟机本身 ...
- 转:[gevent源码分析] 深度分析gevent运行流程
[gevent源码分析] 深度分析gevent运行流程 http://blog.csdn.net/yueguanghaidao/article/details/24281751 一直对gevent运行 ...
- MapReduce源代码分析MapTask分析
前言 MapReduce该分析是基于源代码Hadoop1.2.1代码分析进行的基础上. 该章节会分析在MapTask端的详细处理流程以及MapOutputCollector是怎样处理map之后的col ...
随机推荐
- WebIM(5)----将WebIM嵌入到页面中
在之前的文章中,已经开发了一个简单的WebIM,但是这个WebIM是在独立的页面中的,今天发布的WebIM是一个可以嵌入到自己网页中的版本,你只需添加少量的代码,就可以在页面中嵌入一个WebIM.不过 ...
- [转]JavaScript Namespaces and Modules
Namespaces In most programming languages we know the concept of namespaces (or packages).Namespaces ...
- 自定义MVP .net框架
一个自定义MVP .net框架 AngleFrame 摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngleFrame ...
- 动画操作 (Applying Animations) ngAnimate12
动画操作 (Applying Animations) ngAnimate step 12 1.切换目录 git checkout step-12 npm start 2.效果图 这里在点击右边的缩略图 ...
- 【推荐】30个Matlab视频教程合集(含GUI视频教程)下载
自己收集别人网盘上存的资源,分享一下[点击文件名可得到下载地址] Matlab 7.8 基础视频教程 实例1 数据传递和多窗口编程_avi.zip 205.11 MB Matlab ...
- Linq无聊练习系列4--join练习
/**************join 练习*******************/ //对于1对多关系 var list =from c in ctx.T ...
- facebook api介绍
转自(http://sls.weco.net/node/10773) 一.Facebook API 基礎概念 Facebook API 概論 : API 最大的好處在於可以讓程式開發人員只需要根據 A ...
- [转]Breaking Bad With DTrace
Source:http://initwithfunk.com/blog/2013/05/31/breaking-bad-with-dtrace/ I’ve spent an unwise amount ...
- CSS中文字体的英文名称 – 前台开发必备
做什么用的?写过CSS的都晓得,一般用在font-family后面——为什么不用中文呢?有过一定开发经验的都晓得CSS里面用中文也是会乱码的,特别是没有中文字符集的浏览器,直接成了框框,用英文就可以解 ...
- C#快速学习
C#快速学习笔记(译) 下面是通过代码快速学习C#的例子. 1.学习任何语言都必定会学到的hello,world! using System; public class HelloWorld { ...