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入门到精通教程
查看: 618|回复: 0

C# Winform全局捕捉异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-6 16:43:35 | 显示全部楼层 |阅读模式

    在有的操作系统中winform程序出现异常的时候,并不会弹出异常对话框,而是直接退出了,没有任何迹象,但是在系统的事件查看器(eventvwr.exe)中会发现这个异常。

    为了能够捕捉到程序的异常,我们需要加一个全局异常的捕捉代码,当软件无故退出的时候,这样就能发现异常出现的具体位置。

    网上有一些代码,但是没有说明具体的用法,有的是创建了一个异常捕捉类,在程序入口点去实例化。但是我们大多不愿意去多创建这个类,这个时候只要在Program.cs文件中添加代码去捕捉就行了,捕捉到了之后直接注释掉,简单,实用。

    下面是整理过的:

    在Program.cs中添加捕捉异常代码,添加后的类如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.Threading;
    using System.IO;

    namespace logtest
    {
    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);
    #region Program.cs自动生成的代码
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    // 程序入口点
    Application.Run(new Form1());

    #endregion
    //}
    //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);
    // }

    // MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    // writeLog(str);
    //}
    }

    #region 捕捉全局异常代码
    ///// </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);
    // }

    // MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

    // writeLog(str);
    //}

    //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);
    // }

    // MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

    // writeLog(str);
    //}

    ///// <summary>
    ///// 写文件
    ///// </summary>
    ///// <param name="str"></param>
    //static void writeLog(string str)
    //{
    // string ErrPath = AppDomain.CurrentDomain.BaseDirectory;

    // if (!Directory.Exists(ErrPath))
    // {
    // Directory.CreateDirectory(ErrPath);
    // }
    // using (StreamWriter sw = new StreamWriter( @"D:\ErrLog.txt", true))
    // {
    // sw.WriteLine(str);
    // sw.WriteLine("---------------------------------------------------------");
    // sw.Close();
    // }
    //}
    #endregion

    上面加注释的部分就是异常捕捉的代码,当程序中任何位置出现异常时,会弹出对话框,报出异常的位置,大大方便了代码的调试。

    writeLog()方法是把异常的信息输出到日志文件,我是不需要,直接在弹出的对话框中就可以看见异常的位置了,不过可是使用,注意要保证路径正确并且有写入的权限。

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-12-22 09:46 , Processed in 0.065016 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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