Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 631|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 790 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722766
    发表于 2021-5-13 21:34:12 | 显示全部楼层 |阅读模式

    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/

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-10 23:31 , Processed in 1.025899 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表