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

int i = 10;
int j = 0; try
{
Label1.Text = (i / j).ToString();
}
catch (Exception ex)
{
// 这里处理异常:Redirect、Transfer、Log、Notice等
Console.WriteLine("Page:" + ex.Message);
}

2、Global中使用Application_Error

如果异常在程序中没有被处理(如没有try catch),则异常的处理会流转到这个方法,这里边可以对异常进行处理。但是此方式不能捕捉子线程中的异常。

int i = 10;
int j = 0; Label2.Text = (i / j).ToString();
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
Server.Transfer("ErrorPage.aspx");
}
string message = HttpContext.Current.Error != null ? (HttpContext.Current.Error.InnerException != null ? HttpContext.Current.Error.InnerException.Message : string.Empty) : string.Empty;
Label1.Text = message;

3、在web.config中配置
出现错误后跳转到ErrorPage.aspx,和Application_Error类似,采用redirectMode模式可以传递异常到错误页面。


4、使用FirstChance异常通知。

关联到AppDomain,如果应用程序域内发生异常,则会首先触发这个事件,然后才查找catch块处理异常。不过在这个事件中不能处理异常,不能消灭异常,只是可以按照通知进行处理。因为如果这里处理了异常,catch块就不能进行处理了。

void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
AppDomain.CurrentDomain.FirstChanceException += new EventHandler<System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs>(CurrentDomain_FirstChanceException);
} void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
Console.WriteLine(e.Exception.Message); // 错误:响应在上下文中不能使用
// Response.Redirect("ErrorPage.aspx"); // 错误:未将对象引用设置到对象的实例
// Server.Transfer("ErrorPage.aspx");
}

5、绑定UnhandledException事件

关联到AppDomain,关于这个事件并不是每次都能触发,和使用的方式有关,情况比较多。一般情况下我们只能获取这个异常,而不能阻止中断应用程序。

下边给出一个例子:

void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
} void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.Exception.Message);
}

一般的未处理异常都会被Application_Error捕捉到,我们这里在线程中抛出一个异常。
另外StackOverflowException在.net4中不再能被UnhandledException捕捉到。

 private void CutString()
{
//throw (new Exception("Test Unhandled exception"));
//throw (new StackOverflowException("Test Unhandled exception"));
} protected void Button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(CutString));
th.Start();
}

更多请参考:

http://msdn.microsoft.com/zh-Cn/library/system.appdomain.unhandledexception.aspx

http://mlichtenberg.wordpress.com/2011/09/19/catching-unhandled-exceptions-in-asp-net/

6、延伸:子线程异常的处理。网上有介绍通过代理在主线程处理子线程的异常,但是在asp.net中是无状态的,主线程有可能很快消失,其中的某些处理可能执行失败。
这里使用Thread.Sleep使主线程不会很快结束。这种异常处理起来很麻烦,不建议在asp.net中使用处理时间很长的线程。

        protected void Button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(() =>
{
try
{
throw (new Exception("Test Unhandled exception"));
}
catch (Exception ex)
{
//跳转到错误页面
Response.Redirect("ErrorPage.aspx");
}
})); th.Start(); // asp.net主线程会很快结束,这里让他等等页面跳转。
Thread.Sleep(2000);
}

本文列举了处理异常的几种方式,有通过订阅AppDomain事件的方式,有通过配置文件的方式,还有通过Global的方式,最后还对子线程异常的处理谈了一点想法,但是都没有提供一个完善的解决方案,有兴趣的朋友可以自己试试。

个人独立博客:http://blog.bossma.cn/dotnet/asp-net-resolve-exception-some-methods/

ASP.NET中处理异常的几种方式的更多相关文章

  1. ASP.Net中页面传值的几种方式

    开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...

  2. Asp.net中全局缓存的几种方式

    public class StaticCacheTest { private static IDictionary<string, object> _dic; private static ...

  3. ASP.Net Core中处理异常的几种方法

    本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...

  4. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  5. Spring MVC处理异常的4种方式

    http://blog.csdn.net/ufo2910628/article/details/40399539 http://my.oschina.net/CandyDesire/blog/3333 ...

  6. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  7. ASP.NET 页面之间传值的几种方式

    开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...

  8. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

  9. web.config文件中配置数据库连接的两种方式

    web.config文件中配置数据库连接的两种方式 标签: 数据库webconfig 2015-04-28 18:18 31590人阅读 评论(1)收藏举报    分类: 数据库(74)  在网站开发 ...

随机推荐

  1. 乐观锁--CAS

    悲观锁与乐观锁的区别 悲观锁会把整个对象加锁占为已有后才去做操作,Java中的Synchronized属于悲观锁.悲观锁有一个明显的缺点就是:它不管数据存不存在竞争都加锁,随着并发量增加,且如果锁的时 ...

  2. How to do Mathematics

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:匿名用户链接:http://www.zhihu.com/question/30087053/answer/47815698来源 ...

  3. struts2属性Struts2中属性接收参数中文问题和简单数据验证

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 一:如果表单提交数据中有中文时,尽量应用post方式. 需要在Struts. ...

  4. hihocoder #1224 : 赛车 dfs

    #1224 : 赛车 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/1224 ...

  5. delphi 判断是否出现滚动条

    delphi 判断是否出现滚动条     if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_VSCROLL) <> 0 the ...

  6. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  7. 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明

    将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...

  8. Ruby on Rails Tutorial 第二章 之 用户资源&MVC&REST

    说明:用户资源包括用户数据模型和这个模型相关的Web页面. 1.用户数据模型如下: 2.使用Rails内置的脚手架生成用户资源中,执行如下所示命令: $ rails generate scaffold ...

  9. Ruby用法总结

    1.ruby中的整数.浮点数.字符串之间的相互转换 ruby的整数.浮点数.字符串的类均提供了to_i,to_f,to_s三个方法,分别用于转换成整数.转换成浮点数.转换成字符串. 2.数组的遍历 例 ...

  10. RedHat Enterprise Linux下配置yum源(尝试过的可行方案)

    转自:http://bbs.51cto.com/thread-861410-1.html 一.在linux 6.1中本地yum源配置:首先编辑yum源配置文件我们可以再这个目录中新创建一个配置文件,v ...