当前位置: 首页 >服务端 > ASP.NET中处理异常的几种方式

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

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/

作者:波斯马
来源链接:https://www.cnblogs.com/bossma/p/3365407.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/112754.html

标签:异常处理
分享给朋友:

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