C# 程序异常管理方案
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、获取异常信息
<>捕获catch异常
<>弹窗请求用户描述操作内容:适用于客户端程序
//2、反馈开发人员
//1、邮件方式
public static string SendEmail()
{
//执行发邮件
string Sender = "sender@****.com.cn";//发件人
string Password = "*******";//发件人密码(部分邮箱可以设为空)
string MailServer = "*****.****.****.com.cn";//邮箱服务器域名
int smtpPort = ; //邮件端口
string Recevicer= "recevicer@****.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 = * * ;
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();//必须等待,否则重启的程序还未启动完成;根据情况调整等待时间
}
<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();
{
this.Close();//只是关闭当前窗体。
Application.ExitThread();//退出当前线程上的消息循环,并关闭该线程上的所有窗口。 也会失灵
Application.Exit();//好像只在主线程可以起作用,而且当有线程,或是阻塞方法的情况下,很容易失灵
Environment.Exit(); //前面三种方法都不能很好的退出程序,此方法可以完全退出程序,这个要强制得多。
Process.GetCurrentProcess().Kill();//此方法完全奏效,绝对是完全退出。
主线程设置为后台进程。方法是将主线程的 isBackground = true。据说,这样在关闭主程序时后关闭主线程,并关闭所有的线程。
.netFrame Work compact下是没有强制退出程序进程,替代方式:
System.Diagnostics.Process tt =
System.Diagnostics.Process.GetProcessById(System.Diagnostics.Process.GetCurrentProcess().Id);
tt.Kill();(暴力)
良好的程序设计应该是所有的线程都有条件可以结束循环以退出(包括timer),在程序退出时触发所有线程的终止条件。
}
C# 程序异常管理方案的更多相关文章
- C#开发微信门户及应用(47) - 整合Web API、微信后台管理及前端微信小程序的应用方案
在微信开发中,我一直强调需要建立一个比较统一的Web API接口体系,以便实现数据的集中化,这样我们在常规的Web业务系统,Winform业务系统.微信应用.微信小程序.APP等方面,都可以直接调用基 ...
- [译]MVC网站教程(二):异常管理
介绍 “MVC网站教程”系列的目的是教你如何使用 ASP.NET MVC 创建一个基本的.可扩展的网站. 1) MVC网站教程(一):多语言网站框架 2) MVC网站教程(二):异常管理 3) ...
- Go语言项目的错误和异常管理 via 达达
Go语言项目的错误和异常管理 最近连续遇到朋友问我项目里错误和异常管理的事情,之前也多次跟团队强调过错误和异常管理的一些概念,所以趁今天有动力就赶紧写一篇Go语言项目错误和异常管理的经验分享. 首先我 ...
- 【云计算】Docker 多进程管理方案
docker容器内多进程的管理方案 时间 2015-05-08 00:00:00 涯余 ...
- 【云计算】Docker多进程管理方案-cfengine && supervisord
docker容器内多进程的管理方案 时间 2015-05-08 00:00:00 涯余 原文 http://yayua.github.io/docker/container-process-moni ...
- 你必须知道的容器日志 (2) 开源日志管理方案 ELK
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...
- iOS内存管理布局及管理方案-理论篇
苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...
- Windows 程序自动更新方案: Squirrel.Windows
Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...
- Redux/Mobx/Akita/Vuex对比 - 选择更适合低代码场景的状态管理方案
近期准备开发一个数据分析 SDK,定位是作为数据中台向外输出数据分析能力的载体,前端的功能表现类似低代码平台的各种拖拉拽.作为中台能力的载体,SDK 未来很大概率会需要支持多种视图层框架,比如Vue2 ...
随机推荐
- from表单提交数组
页面代码: function submitForm(){ var categoryArray = new Array(); var $ss = $("select[name=industry ...
- java-正则表达式过滤标签
String str="one <a href=u.php?action=show&uid=122113 target=_blank>超链接文本</a> tw ...
- 前端神器avalonJS入门(一)
转自:http://www.cnblogs.com/vajoy/p/4063824.html avalonJS是司徒正美开发和维护的前端mvvm框架,可以轻松实现数据的隔离和双向绑定,相比angula ...
- 【web开发 | 移动APP开发】 Web 移动开发指南(2017.01.05更新)
版本记录 - 版本1.0 创建文章(2016.12.30) - 版本1.1 更正了hybird相关知识:增加了参考文章(2017.01.05): + Web APP更正为响应式移动站点与页面,简称响应 ...
- ffmpeg 音频转换(amr2mp3)
yasm:http://yasm.tortall.net/Download.html(汇编器,新版本的ffmpeg增加了汇编代码) lame:http://lame.sourceforge.net/d ...
- web前端基础知识-(八)Django进阶之数据库对象关系映射
Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
- vue.js开发环境搭建
1.安装node.js(http://www.runoob.com/nodejs/nodejs-install-setup.html) 2.基于node.js,利用淘宝npm镜像安装相关依赖 在cmd ...
- PHP安装kafka插件
在工作中我们经常遇到需要给php安装插件,今天把php安装kafka的插件的步骤整理下,仅供大家参考 1:需要先安装librdkafka git clone https://github.com/ed ...
- unity之自制玻璃啤酒瓶shader
客户的要求如下 步骤: 1.进行玻璃瓶效果分析 效果如下:高光,类次表面散射(里层通透而外层较为暗淡),外层白色勾勒轮廓. 高光:unity内部提供光滑度参数,越光滑则高光效果越明显,啤酒瓶材质是属于 ...
- [Java] Maven 镜像仓库
配置 修改maven根目录下的conf文件夹中的setting.xml文件. 阿里云 <mirrors> <mirror> <id>alimaven</id& ...