C# 程序异常管理方案

1、程序出现未处理异常(程序中未捕获异常、添加异常处理)

2、程序添加全局异常捕获 tip:程序已处理异常不在捕获范围内。

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //全局异常捕捉
            Application.ThreadException += Application_ThreadException; //UI线程异常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; //多线程异常

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

        //UI线程异常
        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            WinformException.FrmBugReport.ShowBug(e.Exception);//执行异常处理
        }

        //多线程异常
        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            WinformException.FrmBugReport.ShowBug((Exception)e.ExceptionObject);//执行异常处理
        }

3、执行异常处理

    <方案1>自动执行:适用于服务器程序

    <方案2>弹出异常处理窗口:提供给用户处理,适用于客户端程序

可供选择的异常解决方案:
//1、获取异常信息

<1>捕获catch异常
<2>弹窗请求用户描述操作内容:适用于客户端程序

//2、反馈开发人员

    //1、邮件方式
    public static string SendEmail()
    {
        //执行发邮件
        string Sender = "[email protected]****.com.cn";//发件人
        string Password = "*******";//发件人密码(部分邮箱可以设为空)
        string MailServer = "*****.****.****.com.cn";//邮箱服务器域名
        int smtpPort = 25; //邮件端口
        string Recevicer= "[email protected]****.com.cn";//收件人 可以为多人)
        System.Net.Mail.SmtpClient sc = new SmtpClient(MailServer, smtpPort);
        NetworkCredential nc = new NetworkCredential(UserName, Password);
        sc.Credentials = nc;
        MailMessage MyEmailMessage = new MailMessage();
        MyEmailMessage.From = new MailAddress(UserName);
        MyEmailMessage.To.Add(new MailAddress(temp));
        MyEmailMessage.Subject = "";//主题
        MyEmailMessage.Body = content; //内容
        MyEmailMessage.IsBodyHtml = true; //是否为Html、纯文本
        MyEmailMessage.Priority = MailPriority.High; //优先级
        sc.Send(MyEmailMessage);
    }
    //2、短信通知
    public static string SendSms()
    {
        //执行发短信
        string targeturl = url.Trim().ToString();
        HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl);
        hr.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        hr.Method = "GET";
        hr.Timeout = 30 * 60 * 1000;
        WebResponse hs = hr.GetResponse();
        Stream sr = hs.GetResponseStream();
        StreamReader ser = new StreamReader(sr, Encoding.Default);
        strRet = ser.ReadToEnd();
    }

//3、记录异常日志

    //存入数据库异常日志 Tip:最好使用不同数据库。避免数据库异常问题
    public void SaveLog()
    {
        //数据库操作
    }

//4、自动重启程序

<way1>
    public void AutoReStart()
    {
        //执行重启
        Process p = new Process();
        p.StartInfo.FileName = "你的启动项.exe";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.CreateNoWindow = false;
        p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        p.Start();
        p.StandardInput.WriteLine(sExePath + " " + sArguments);
        p.StandardInput.WriteLine("exit");
        p.Close();
        System.Threading.Thread.Sleep(2000);//必须等待,否则重启的程序还未启动完成;根据情况调整等待时间
    }
    <way2>
    public void AutoReStart()
    {
        //重启程序,需要时加上重启的参数
        System.Diagnostics.ProcessStartInfo cp = new System.Diagnostics.ProcessStartInfo();
        cp.FileName = Application.ExecutablePath;
        cp.Arguments = "重启参数";
        cp.UseShellExecute = true;
        System.Diagnostics.Process.Start(cp);
    }

//5、直接关闭

    public void CloseApp()//选择一种, 异常崩溃时建议 Environment.Exit(0);
    {
        this.Close();//只是关闭当前窗体。
        Application.ExitThread();//退出当前线程上的消息循环,并关闭该线程上的所有窗口。 也会失灵
        Application.Exit();//好像只在主线程可以起作用,而且当有线程,或是阻塞方法的情况下,很容易失灵
        Environment.Exit(0); //前面三种方法都不能很好的退出程序,此方法可以完全退出程序,这个要强制得多。
        Process.GetCurrentProcess().Kill();//此方法完全奏效,绝对是完全退出。
        主线程设置为后台进程。方法是将主线程的 isBackground = true。据说,这样在关闭主程序时后关闭主线程,并关闭所有的线程。
        .netFrame Work compact下是没有强制退出程序进程,替代方式:
        System.Diagnostics.Process tt =         System.Diagnostics.Process.GetProcessById(System.Diagnostics.Process.GetCurrentProcess().Id);
        tt.Kill();(暴力)
        良好的程序设计应该是所有的线程都有条件可以结束循环以退出(包括timer),在程序退出时触发所有线程的终止条件。
    }
时间: 2024-10-25 03:43:08

C# 程序异常管理方案的相关文章

C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案

在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基于JSON数据格式的Web API接口,在我之前的几篇随笔中,对这方面都有一定的介绍,本篇继续这个主题,细致深入的阐述如何在接口和源码的基础上整合Web API.微信后台管理及前端微信小程序的应用方案. 1.基于Web API的微信开发框架 首先我们各个业务模块,都应该围绕着Web API进行展开,

定制new和delete更改内存管理方案

C++允许手工管理内存.依据使用内存的行为特征,然后修改分配和归还工作,以求获得其所建置的系统的最佳效率(包括时间和空间).这给了程序员通过定制operatornew和operatordelete的方式来更改new与delete表达式从而更改内存管理方案的自由.但是享受这种自由的时候必须遵守一定的规范,具体可以参见<EffectiveC++ 2nd>的相关条款.本文在此基础上补充解释一些特别容易引起误解的问题. operator new和operator delete只适合用来分配单一对象.A

使用Spring进行统一日志管理 + 统一异常管理

统一日志和异常管理配置好后,SSH项目中,代码以往散落的log.info() 和 try..catch..finally 再也不见踪影! 统一日志异常实现类: [java] view plain copy package com.pilelot.web.util; import org.apache.log4j.Logger; import org.springframework.aop.ThrowsAdvice; import org.springframework.dao.DataAcces

TurboMail邮件系统企业邮件安全使用管理方案

作为商业化邮件服务器的翘楚产品,TurboMail邮件系统致力于为企事业客户提供灵活多变的个性化企业邮箱管理方案,力求能满足不同的客户对企业邮件的各种个性化管理诉求,从而让企业邮件能满足,甚至能促进企业信息化管理的高度发展.以下列举TurboMail邮件系统的部分邮件安全管理功能,希望能对企业信息管理部门有所帮助.1. 用户权限 在用户管理模块中,简单的图形化管理框便可以限定用户最基础的邮件管理权限,例如只能收发域内邮件.不能通过pop功能下载邮件.最大附件的大小.邮件收发的频率等.2. 收发限

Linux_rpm和yum实现程序包管理功能

程序包管理: 内核功能:进程管理.内存管理.网络协议栈.驱动程序.... 应用程序: 包管理器:打包,包管理(安装.升级.卸载.查询及校验) deb: debian rpm: redhat package manager (早起使用perl语言写) RPM is Package Manager ---->通过C语言实现,性能大幅提升 程序包的组成部分: 二进制程序:/bin, /sbin,/ /usr/bin, /usr/sbin,  可执行文件 库文件:/lib64, /usr/lib64  

RDIFramework.NET ━ 9.13 系统日志与系统异常管理 ━ Web部分

RDIFramework.NET ━ .NET快速信息化系统开发框架 9.13  系统日志与系统异常管理 -Web部分  一个软件在投入运行时不可能没有任何异常,在软件发生异常时及时的记录下来,也好我们及时对异常进行跟踪,以解决发生的异常,避免异常的再次发生.异常分为两种情况,一种为客户端发生的异常,另一种为服务端发生的异常.对于客户端发生的异常,通常都会及时的弹出,用户看到后可以反馈给我们.服务器端产生的异常会自动记录到数据库中,管理员可以通过框架异常管理进行查看操作. 框架日志管理对于框架的

android看不见main函数怎么办?程序异常了,可以不提示“xxx软件停止运行”吗?

今天遇到了这个问题,分享一下解决方案. android没有main 函数,自然也就不存在main里面添加异常处理来实现全局异常捕获的方案.那android程序有全局异常补货的解决方案吗? 答案是有的: 那就是你得继承android工程里面的application,如: public class ReaderApplication extends Application implements Thread.UncaughtExceptionHandler{......} 并实现线程异常补货接口:T

基于开源技术的上网行为管理方案实现案例

基于开源技术的上网行为管理方案实现案例 互联网已经成为人们工作.生活过程不可或缺的工具.在企业普遍存在着电脑和互联网络滥用的严重问题,网购.各种直播.电影.P2P工具下载等与工作无关的行为占用了有限的带宽,影响了工作,作为企业如何监管?购买商业软件?我看,未必适合你的公司. 选择开源工具怎么样?下面我为大家介绍两款开源工具及案例.用以实现用户上网内容审计和行为监控.这些技术的基础基于嗅探技术,所以大家在浏览下文时,一定要对网络嗅探技术有深刻理解. 1.开源工具Xplico Xplico工作原理是

SylixOS异常管理

异常管理 SylixOS提供了一种平台无关的异常管理方法.当系统产生了写时拷贝.缺页等MMU访问失效异常或其他种类异常时,SylixOS会在异常中构建异常处理线程执行陷阱,在异常退出后的任务上下文中进行异常处理,完成所有的页面操作,如果操作失败线程将自我销毁.当为缺页中断等一般异常时,陷阱执行完毕后,系统将回到刚刚访问内存并产生异常的那条指令.其函数接口如下所示. LW_API VOID API_VmmAbortIsr (addr_t ulRetAddr, addr_t ulAbortAddr,