ASP.NET中异常处理的注意事项
一、ASP.NET中需要引发异常的四类情况
1、如果运行代码后,造成内存泄漏、资源不可用或应用程序状态不可恢复,则引发异常。Console这个类中,有很多类似这样的代码:
if ((value < 1) || (value > 100))
{
throw new ArgumentOutOfRangeException("value", value, Environment.GetResourceString("ArgumentOutOfRange_CursorSize"));
}
2、在捕获异常的时候,如果需要包装一些更有用的信息,则引发异常。这类异常的引发在UI层特别有用。系统引发的异常所带的Message往往更倾向于技术性的描述,而在UI层,异常的用户很可能是最终用户。如果我们需要将异常的Message信息呈现给最终用户,更好的做法是包装异常,然后引发一个含有友好信息的新异常。
3、如果底层异常在高层操作的上下文中没有意义,则可以考虑捕获这些底层异常,并引发新的有意义的异常。如将一个InvalidCastException引发为新的ArgumentException。
4、捕获底层API错误代码,并抛出。Console为我们封装了调用windows api返回的错误代码,而让代码引发一个新的异常。
二、ASP.NET系统自带的异常类
1、Exception 所有异常对象的基类
2、SystemException 运行时产生的所有错误的基类
3、IndexOutOfRangeException 当一个数组的下标超出范围时运行时引发
4、NullReferenceException 当一个空对象被引用时运行时引发
5、InvalidOperationException 当对方法的调用对对象的当前状态无效时,由某些方法引发
6、ArgumentException 所有参数异常的基类
7、ArgumentNullException 在参数为空(不允许)的情况下,由方法引发
8、ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发
9、InteropException 目标在或发生在CLR外面环境中的异常的基类
10、ComException 包含COM 类的HRESULT信息的异常
11、SEHException 封装win32 结构异常处理信息的异常
三、ASP.NET中异常处理注意事项
1、避免在finally内撰写无效代码
你应该始终认为finally内代码会在方法return之前被执行,哪怕return是在try块中。但,需要区分引用类型变量和值类型变量在finally中会导致不同结果。
例如
private static int TestIntReturnInTry()
{
int i;
try
{
return i = 1;
}
finally
{
i = 2;
Console.WriteLine("\\t将int结果改为2,finally执行完毕");
}
}
它返回的将是1。代码中,i=2实际上是一段无效代码,如果编译采用Release模式,编译器会直接将i=2删除,它不会为其生成对应的IL代码。
但是:
static User TestUserReturnInTry()
{
User user = new User() { Name = "Mike", BirthDay = new DateTime(2010, 1, 1) };
try
{
return user;
}
finally
{
user.Name = "Rose";
user.BirthDay = new DateTime(2010, 2, 2);
Console.WriteLine("\\t将user.Name改为Rose");
}
}
TestUserReturnInTry方法返回的User中,Name的值已经改变为Rose了。
2、避免嵌套异常
应该允许异常在调用堆栈中往上传播,不要过多使用catch,然后再throw。无故地嵌套异常是我们要极力避免的。
3、避免“吃掉”异常
避免“吃掉”异常,并不是说不应该“吃掉”异常,而是这里面有个重要原则:该异常可悲预见,并且通常情况它不能算是一个Bug。
想象你正在对上万份文件进行解密,这些文件来自不同的客户端,很有可能存在文件倍破坏的现象,你的目标就是要讲解密出来的数据插入数据库。这个时候,你不得不忽略那些解密失败的问题,让这个过程进行下去。当然,记录日志是必要的, 因为后期你可能会倍解密失败的文件做统一的处理。
另外一种情况,可能连记录日志都不需要。在对上千个受控端进行控制的分布式系统中,控制端需要发送心跳数据来判断受控端的在线情况。通常的做法是维护一个信号量,如果在一个可接受的阻滞时间如(如500ms)心跳数据发送失败,那么控制端线程将不会收到信号,即可以判断受控端的断线状态。在这种情况下,对每次SocketException进行记录,通常也是没有意义的。
如果你不知道如何处理某个异常,那么千万不要“吃掉”异常,如果你一不小“吃掉”了一个本该网上传递的异常,那么,这里可能诞生一个BUg,而且,解决它会很费周折。
4、避免在调用栈较低位置记录异常
最适合进行异常记录和报告的是应用程序的最上层,这通常是UI层。假设存在这样的一个应用程序,它的BLL层,即可能被一个Winform窗口程序调用,也可能被一个控制台应用程序调用,那么如果要在BLL模块向管理员报告异常的时候,你不知该使用MessageBox方法还是Console.Write方法。
如果异常在调用栈的较低位置被记录或报告,且还存在被包装后重新抛出的情况,这就会让记录重复出现。
5、不要再从System.ApplicationExcetipn这个基类派生异常
微软自己也已经修正这一点,当前的建议是:从System.Exception或其它常见基本异常之一派生异常。事实上,现在如果你在Visual studio中输入Excetion,然后使用快捷键tab,vs会自动给你创建一个继承自System.Exception的自定义异常类
四、ASP.NET中异常处理的其它建议
1、当引发异常时,要提供有意义的文本。
2、要引发异常仅当条件是真正异常;也就是当一个正常的返回值不满足时。
3、如果你的方法或属性被传递一个坏参数,要引发一个ArgumentException异常。
4、当调用操作不适合对象的当前状态时,要引发一个InvalidOperationException异常。
5、要引发最适合的异常。
6、要使用链接异常,它们允许你跟踪异常树。
7、不要为正常或预期的错误使用异常。
8、不要为流程的正常控制使用异常。
9、不要在方法中引发NullReferenceException或IndexOutOfRangeException异常。
ASP.NET中异常处理的注意事项的更多相关文章
- [整理]ASP.NET 中异常处理
[整理]ASP.NET 中异常处理 1.直接通过重写Controller的OnException来处理异常 public class HomeController : Controller { pub ...
- JQuery Form AjaxSubmit(options)在Asp.net中的应用注意事项
所需引用的JS: 在http://www.malsup.com/jquery/form/#download 下载:http://malsup.github.com/jquery.form.js 在ht ...
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
- ASP.NET MVC异常处理
ASP.NET MVC异常处理方案 如何保留异常前填写表单的数据 ASP.NET MVC中的统一化自定义异常处理 MVC过滤器详解 MVC过滤器使用案例:统一处理异常顺道精简代码 ASP.NET MV ...
- 在 ASP.NET 中创建数据访问和业务逻辑层(转)
.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...
- ASP.net 中手工调用WS(POST方式)
ASP.net 中手工调用WS(POST方式)核心代码:string strUrl="http://localhost:21695/service1.asmx/getmythmod" ...
- ASP.NET中application对象
ASP.NET中application对象的使用. Application对象的应用 1.使用Application对象保存信息 (1).使用Application对象保存信息 Applicat ...
- asp.net中当服务器出错时显示指定的错误页面
http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常. ...
- ASP.NET中处理异常的几种方式
1.程序中使用try catch 对于预知会发生异常的代码段使用try catch主动捕获异常,适用于提示给用户或跳转到错误页面,或者通过其它方式处理异常(日志.通知等). int i = 10; i ...
随机推荐
- A星寻路算法入门(Unity实现)
最近简单学习了一下A星寻路算法,来记录一下.还是个萌新,如果写的不好,请谅解.Unity版本:2018.3.2f1 A星寻路算法是什么 游戏开发中往往有这样的需求,让玩家控制的角色自动寻路到目标地点, ...
- Harbor 学习分享系列1 - centos7.4安装harbor1.5.2
centos7.4安装harbor1.5.2 前言 本系列分享将Harbor有关教程:分享形式会以百度云盘的形式进行分享,主要教程将以markdown格式进行分享:建议使用markdownpad2这款 ...
- 【URLOS应用开发基础】10分钟制作一个nginx静态网站环境应用
URLOS开发者功能已上线有一段时间了,目前通过部分开发者的使用体验来看,不得不说URLOS在服务器软件开发效率方面确实有着得天独厚的优势,凭借docker容器技术与其良好的应用生态环境,URLOS必 ...
- 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...
- BugPhobia开发篇章:Beta阶段第I次Scrum Meeting
0x01 :Scrum Meeting基本摘要 Beta阶段第一次Scrum Meeting 敏捷开发起始时间 2015/12/10 00:00 A.M. 敏捷开发终止时间 2015/12/12 23 ...
- 《实时控制软件设计》之Github提交作业步骤
在掌握GIT/GITHUB基本操作后,接下来把第一次的编程作业提交到 https://github.com/RTCSD15/HOMEWORK1 ,把第二次的编程作业提交到https://github. ...
- squid介绍和作用
介绍 squid服务程序是一款在Unix系统中最为流行的高性能代理服务软件,通常会被当作网站的前置缓存服务,用于替代用户向网站服务器请求页面数据并进行缓存,通俗来讲,Squid服务程序会接收用户的请求 ...
- Linux命令(九)比较文件差异 diff
diff 命令介绍 diff 命令的功能为逐行比较两个文本文件,列出其不同之处.对给出的文件进行系统的检查,并显示出两个文件中所有不同的行.如果 diff 命令后跟的是目录,则会对该目录中的同名文件进 ...
- [转帖][Bash Shell] Shell学习笔记
[Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html 阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...
- CentOS下部署Jupyter
目录 安装 配置 准备密码密文 生成配置文件 修改配置 启动 参考:在服务器搭建Jupyter notebook 安装 为了环境比较轻,使用pip安装,非Anaconda: # 创建Python虚拟环 ...

{
int i;
{
}
}