一、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中会导致不同结果。

例如

 
C# 代码   复制

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代码。

但是

C# 代码   复制
       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中异常处理的注意事项的更多相关文章

  1. [整理]ASP.NET 中异常处理

    [整理]ASP.NET 中异常处理 1.直接通过重写Controller的OnException来处理异常 public class HomeController : Controller { pub ...

  2. JQuery Form AjaxSubmit(options)在Asp.net中的应用注意事项

    所需引用的JS: 在http://www.malsup.com/jquery/form/#download 下载:http://malsup.github.com/jquery.form.js 在ht ...

  3. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  4. ASP.NET MVC异常处理

    ASP.NET MVC异常处理方案 如何保留异常前填写表单的数据 ASP.NET MVC中的统一化自定义异常处理 MVC过滤器详解 MVC过滤器使用案例:统一处理异常顺道精简代码 ASP.NET MV ...

  5. 在 ASP.NET 中创建数据访问和业务逻辑层(转)

    .NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...

  6. ASP.net 中手工调用WS(POST方式)

    ASP.net 中手工调用WS(POST方式)核心代码:string strUrl="http://localhost:21695/service1.asmx/getmythmod" ...

  7. ASP.NET中application对象

    ASP.NET中application对象的使用. Application对象的应用  1.使用Application对象保存信息  (1).使用Application对象保存信息  Applicat ...

  8. asp.net中当服务器出错时显示指定的错误页面

    http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常. ...

  9. ASP.NET中处理异常的几种方式

    1.程序中使用try catch 对于预知会发生异常的代码段使用try catch主动捕获异常,适用于提示给用户或跳转到错误页面,或者通过其它方式处理异常(日志.通知等). int i = 10; i ...

随机推荐

  1. [DEBUG]椭圆的中点Bresenham算法边缘绘制出现错误

    在使用椭圆的中点Bresenham算法绘制椭圆时, 当椭圆足够大时, 椭圆的边缘会出现下面这种情况. 出错原因: 将a, b声明为了int类型, 导致中点判别式中发生溢出 关注后面的a*b*a*b当a ...

  2. Catlike学习笔记(1.3)-使用Unity画更复杂的3D函数图像

    第三篇来了-今天去参加了 Unite 2018 Berlin,感觉就是....非常困...回来以后稍微睡了下清醒了觉得是时候认真学习下了,不过讲的很多东西都是还没有发布或者只有 Preview 的版本 ...

  3. java中多态的实现机制

    多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前 ...

  4. ABP中文文档及源码说明

    目录 ABP.ModuleZero(ABP自带的一套用户模块) 版本管理(Edition) 特性管理(Feature)

  5. hadoop-lzo 安装配置

           在hive中要想使用lzo的格式,需要配置安装好lzo工具并且在hadoop的core-site.xml与mapred-site.xml中配置相应的配置 一.编译安装lzo与lzop 在 ...

  6. linux内核分析--计算机是如何工作的

    实验部分 使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码. 源代码如下: int g(int x) { return x + 9; } int f(int x) ...

  7. A总结

    Alpha 答辩总结 评审表 组名 格式 内容 ppt 演讲 答辩 总计 天机组 15 15 14 15 14 73 PMS 16 16 15 15 16 78 日不落战队 16 16 16 15 1 ...

  8. 这个C#程序真了不起

    (1)在2~31中,这个数不能且仅不能被两个相邻数整除 (2)2 123 581 660 200 (2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,19,20,21,22,2 ...

  9. 初学Nutch之简介与安装

    1.Nutch简介 Nutch是一个由Java实 现的,开放源代码(open-source)的web搜索引擎.主要用于收集网页数据,然后对其进行分析,建立索引,以提供相应的接口来对其网页数据进行 查询 ...

  10. iOS记录一常用的方法和语句

    1.当前控制器是否还显示,比较常用于网络请求回来页面已退出 //当前视图控制器是否在显示 +(BOOL)isCurrentViewControllerVisible:(UIViewController ...