首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在 Application.ThreadException 事件处理程序中获取整个异常链?

在 Application.ThreadException 事件处理程序中获取整个异常链,可以通过递归地处理异常的 InnerException 属性来实现。以下是一个示例代码:

代码语言:csharp
复制
using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.ThreadException += Application_ThreadException;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            HandleException(e.Exception);
        }

        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            HandleException((Exception)e.ExceptionObject);
        }

        private static void HandleException(Exception ex)
        {
            string message = GetExceptionMessage(ex);
            MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Application.Exit();
        }

        private static string GetExceptionMessage(Exception ex)
        {
            string message = ex.Message;

            if (ex.InnerException != null)
            {
                message += "\n\nInner Exception:\n" + GetExceptionMessage(ex.InnerException);
            }

            return message;
        }
    }
}

在上述代码中,我们在 Main 方法中注册了 Application.ThreadException 事件处理程序和 AppDomain.CurrentDomain.UnhandledException 事件处理程序,以便在发生未处理的异常时进行处理。HandleException 方法用于处理异常,GetExceptionMessage 方法用于递归地获取整个异常链的消息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • ASP.NET页面周期学习笔记之一

    ASP.NET页面生命周期——理解:重中之重!!! 1.基本概念:所谓的页面生命周期,指的是一个ASP.NET页面类对象从初始化到销毁经过的步凑过程; 2.大致步凑: (1)初始化:PreInit,Init,InitComplete (2)加载数据和页面:LoadState,ProcessPostData,PreLoad,Load,ProcessPostData(第二次)... (3)触发事件:ChangedEvents PostBackEvent (4)保存状态并呈现页面:SaveState,SaveStateComplete,Render 3.步凑详解: ProcessRequestMain-> PreInit-PerfromPreInit()->预初始化:准备初始化页面控件,设置皮肤; Init-InitRecursive(null)->页面对象初始化; InitComplete(OnInitComplete-EventArgs.Empty)->页面对象初始化完成:加载ViewState,还原控件状态,登记用户触发的事件; if(this.IsPostBack) {    LoadState-LoadAllState():加载ViewState->ProcessPostData-ProcessPostData(this._requestValueCollection,true):还原控件状态 } ->PreLoad-OnPreLoad(EventArgs.Empty)->Load-LoadRecursive()-> if(this.IsPostBack) {    ProcessPostData Second Try-ProcessPostData(this._leftoverPostData,false)->Raise ChangedEvents-RaiseChangedEvents()->Raise PostBackEvent -RaisePostBackEvent(this._requestValueCollection);):触发控件事件 } ->SaveStateComplete-OnSaveStateComplete(EventArgs.Empty):保存页面和控件数据到ViewState-> Render->RenderControl(this.CreateHtmlTextWriter(this.Response.Output)):生成最终HTML代码

    03

    【深入浅出C#】章节5:高级面向对象编程:委托和事件

    委托和事件是高级面向对象编程中的重要概念,用于实现程序的灵活性、可扩展性和可维护性。它们在实现回调、事件处理和异步编程等方面发挥着关键作用。 委托允许我们将方法视为一种对象,可以将方法作为参数传递、存储在变量中,并在需要时进行调用。这种能力使得委托非常适合用于实现回调函数,将一个方法传递给另一个方法,使得后者在适当的时候调用前者。委托还支持委托链和多播委托的概念,可以将多个方法链接在一起形成一个委托链,依次执行它们。 事件是委托的一种特殊形式,用于实现观察者模式和事件驱动编程。事件提供了一种简洁和可靠的方式来处理和响应特定的程序事件,如用户交互、消息通知等。通过事件,我们可以定义事件的发布者和订阅者,发布者触发事件时,订阅者会收到通知并执行相应的操作。这种松耦合的设计模式使得程序更具可扩展性和可维护性。 委托和事件在异步编程中也起到重要的作用。它们可以帮助我们处理异步操作的回调和通知,提高程序的响应性和效率。通过将异步操作封装在委托或事件中,我们可以在异步操作完成后执行相应的处理逻辑,而不需要阻塞主线程或进行复杂的线程管理。

    02

    在Global.asax中获取Session的注意事项

    几年前给朋友珠宝公司开发过一套旺财珠宝库存管理系统,用得还是web Form老技术,但是更多的走Ashx+Ajax,但前端可是HTML5+jQuery+BootStrap等新技术,所以不论功能还是用户体验,都能很完美的满足用户要求(用户才不管你用的是什么技术,先进的和古老的都必须解决他的问题,然后还需要好用)。近期特别反馈说有些页面比较慢,我觉得用了几年了,数据库就近2个G了,可能是数据库查询的问题,也可能是程序执行的问题,也可能用户网络问题。数据库可以在服务器上用Sql Server Profiler进行查询分析,但页面上还得做点跟踪。于是就用Global.asax来实现,本来很方便的,但为了获取当前登录用户,需要在Global.asax中获取Session,花了点时间才搞定,记录下来分享一下。

    02
    领券