`

C# WINFORM 捕获全局异常

阅读更多
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
namespace GobalException
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                //处理未捕获的异常  
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                //处理UI线程异常  
                Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                //处理非UI线程异常  
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            catch (Exception ex)
            {
                string str = "";
                string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";

                if (ex != null)
                {
                    str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
                         ex.GetType().Name, ex.Message, ex.StackTrace);
                }
                else
                {
                    str = string.Format("应用程序线程错误:{0}", ex);
                }


                writeLog(str);
                MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        /// <summary>
        ///这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,如出错后弹出一个漂亮的出错提示窗体,给大家做个参考
        ///做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等
        ///这就是仁者见仁智者见智,大家自己做了。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
           
            string str = "";
            string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
            Exception error = e.Exception as Exception;
            if (error != null)
            {
                str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
                     error.GetType().Name, error.Message, error.StackTrace);
            }
            else
            {
                str = string.Format("应用程序线程错误:{0}", e);
            }

            writeLog(str);   
            MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            string str = "";
            Exception error = e.ExceptionObject as Exception;
            string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
            if (error != null)
            {
                str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);
            }
            else
            {
                str = string.Format("Application UnhandledError:{0}", e);
            }

            writeLog(str);
            MessageBox.Show("发生致命错误,请停止当前操作并及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        /// <summary>
        /// 写文件
        /// </summary>
        /// <param name="str"></param>
        static void writeLog(string str)
        {
            if (!Directory.Exists("ErrLog"))
            {
                Directory.CreateDirectory("ErrLog");
            }

            using (StreamWriter sw = new StreamWriter(@"ErrLog\ErrLog.txt", true))
            {
                sw.WriteLine(str);
                sw.WriteLine("---------------------------------------------------------");
                sw.Close();
            }
        }
    }
}

转自:http://www.cnblogs.com/kevinGao/archive/2011/11/02/2233420.html

还找到一个例子:
你好!
     一般使用Application的ThreadException事件,可以参考这个例子:
// Creates a class to throw the error.
public class ErrorHandler : System.Windows.Forms.Form {

    // Inserts the code to create a form with a button.

    // Programs the button to throw an exception when clicked.
    private void button1_Click(object sender, System.EventArgs e) {
       throw new ArgumentException("The parameter was invalid");
    }

    public static void Main(string[] args) {
       // Creates an instance of the methods that will handle the exception.
       CustomExceptionHandler eh = new CustomExceptionHandler();

       // Adds the event handler to to the event.
       Application.ThreadException += new ThreadExceptionEventHandler(eh.OnThreadException);

       // Runs the application.
       Application.Run(new ErrorHandler());
    }
}

// Creates a class to handle the exception event.
internal class CustomExceptionHandler {

    // Handles the exception event.
    public void OnThreadException(object sender, ThreadExceptionEventArgs t)
    {
       DialogResult result = DialogResult.Cancel;
       try
       {
          result = this.ShowThreadExceptionDialog(t.Exception);
       }
       catch
       {
          try
          {
             MessageBox.Show("Fatal Error", "Fatal Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
          }
          finally
          {
             Application.Exit();
          }
       }

       // Exits the program when the user clicks Abort.
       if (result == DialogResult.Abort)
          Application.Exit();
    }

    // Creates the error message and displays it.
    private DialogResult ShowThreadExceptionDialog(Exception e) {
       string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n";
       errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
       return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
    }
}
分享到:
评论
1 楼 wallimn 2013-10-04  
后面一个试了一下,效果不错。

相关推荐

    winform捕捉全局异常_winform_

    "winform捕捉全局异常"这个主题就是关于如何在WinForm应用程序中设置一个全局异常处理机制,以便在程序运行过程中捕获和处理未预期的错误,避免程序突然崩溃。下面将详细介绍这个知识点。 1. **异常处理基础**: ...

    C#winform 全局错误捕捉 可以让错误跳过去继续执行住程序

    在C# WinForm应用开发中,全局错误处理是至关重要的,因为它可以帮助我们捕获和管理程序运行时可能遇到的各种异常,确保程序的稳定性和用户体验。本文将深入探讨如何实现C# WinForm的全局错误捕捉,并解释如何在发生...

    C# WinForm捕获全局变量异常 SamWang解决方法

    总结来说,C# WinForm捕获全局变量异常的关键在于正确地订阅和处理`ThreadException`和`UnhandledException`事件,以及编写一个自定义的异常处理逻辑,这将极大地增强程序的健壮性和用户体验。记得在项目完成后,...

    WinForm全局异常捕获方法

    C# WinForm全局异常捕获方法 在主程序入口设置应用程序处理异常方式:ThreadException处理 处理UI线程异常和非UI线程异常 生成自定义异常消息,显示异常对象 备用异常消息:当ex为null时有效和异常字符串文本

    c# winform 鼠标、键盘消息拦截

    在C# WinForm应用开发中,有时我们需要对用户的键盘和鼠标事件进行特殊的处理,比如拦截、过滤或修改这些消息。本文将深入探讨如何在VS2013环境下使用C# WinForm来实现这一功能。 首先,`PreFilterMessage`方法是...

    winform键盘和鼠标事件的捕捉与重写(快捷键)

    `可使窗体捕获所有按键事件,然后在窗体的`KeyDown`事件中处理快捷键逻辑。 - 也可以通过`ToolStripMenuItem`或`ToolStrip`中的菜单项来定义快捷键,这些菜单项会自动处理快捷键事件。 5. 示例代码: ```csharp ...

    winform 对异常的处理源码

    在WinForm应用中,异常处理不仅仅是简单的try-catch-finally结构,还可以利用Application.ThreadException事件全局处理线程级异常。这个事件允许你在应用程序级别捕获和处理任何未处理的UI线程异常,避免程序意外...

    C# Hock 全局监听程序外的键盘和鼠标的事件

    "C# Hook 钩子"就是这样一个专题,它允许开发者创建一个全局监听程序,来捕获并处理系统的键盘和鼠标事件。 钩子是一种机制,由Windows操作系统提供,它允许应用程序设置一个或多个“钩子”,以便拦截特定类型的...

    C# winform 设置快捷键

    通过以上步骤,你可以在C# WinForm应用中实现全局快捷键功能。`KeyBoardHook`库提供了简单而强大的方式来管理和响应键盘输入,使得开发过程更加高效。记得在使用时遵循最佳实践,确保用户体验的流畅性。

    程序崩溃自动重启以及将未捕获到的异常写退出栈

    2. **GlobalExceptionHandler**: 一个全局异常处理器,用于捕获未被捕获的异常并打印堆栈信息。 3. **LoggingModule**: 负责记录和输出日志,包括控制台输出和文件记录。 4. **UtilityFunctions**: 提供一些辅助函数...

    c# 获取全局的鼠标坐标

    在C#编程中,获取全局鼠标坐标是一项常见的需求,特别是在开发需要实时监控鼠标位置的应用时。全局鼠标坐标指的是鼠标在操作系统屏幕上的精确位置,不受任何特定窗口或应用程序限制。下面我们将详细探讨如何在C#中...

    C# winform 资源管理系统

    C#的try-catch语句用于捕获和处理异常,避免程序因未预期的错误而崩溃。 9. **设计模式**:良好的软件设计往往采用设计模式,如单例模式(用于管理全局资源)、工厂模式(用于创建对象)和MVC(模型-视图-控制器)...

    c#写的类似windows文件查询搜索

    在文件操作中,可能会遇到权限问题、磁盘满等问题,开发者需要捕获并处理这些异常。 9. **版本控制**:文件名为"WinSearchFile2.0",这可能表示程序的第二个主要版本,意味着它可能经历了迭代和改进,包括功能增强...

    C#winform实现的全键盘2个实例源代码.rar

    在本文中,我们将深入探讨如何使用C# WinForm来实现全键盘功能,并通过两个实例来进一步阐述这个主题。C#是一种面向对象的编程语言,它为Windows桌面应用程序开发提供了强大的支持,而WinForm则是C#中用于构建用户...

    C#winform实现的向导程序代码

    在C# WinForm中,这通常通过设计多个表单(Forms)来实现,每个表单代表向导的一个步骤。我们可以创建一个基类,包含公共属性和方法,如当前步骤、下一步、上一步等,然后让每个步骤的表单继承自这个基类。这样可以...

    C# Winform 实现屏蔽键盘的win和alt+F4的实现代码

    总之,通过以上知识点,我们可以创建一个C# Winform应用程序,使用全局键盘钩子来阻止特定键盘事件,如Win键和Alt+F4,以满足特定场景下的需求。不过,此类操作需要谨慎,过度限制用户交互可能会导致用户体验下降或...

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库、工具类库、扩展类库、多页面开发框架

    4. 错误处理:提供统一的异常处理机制,便于全局错误捕获和处理。 三、多页面开发框架 SunnyUI.Net的多页面开发框架允许开发者轻松构建具有多个工作空间的应用程序,每个工作空间可以独立承载不同的功能模块。框架...

    C#键盘钩子实现全局快捷键.pdf

    标题中提到的"C#键盘钩子实现全局快捷键",是指在C#编程中利用Windows钩子(Hook)机制来捕获和处理键盘事件,以此创建可以在系统范围内工作的快捷键。这种技术涉及到深入的系统底层交互,通常使用Win32 API来实现。...

    C# 捕捉键盘输入 键盘钩子

    在C#编程中,捕获键盘输入是一种常见的需求,特别是在开发需要监听用户键盘活动的应用时。键盘钩子(Keyboard Hook)是一种系统级别的机制,允许应用程序拦截和处理键盘事件,即使焦点不在该应用上也能实现。本篇...

Global site tag (gtag.js) - Google Analytics