WPF 基础 - 启动与退出及异常捕获
1. 若需要控制 exe 实例数量
bool ret;
mutex = new System.Threading.Mutex(true, exename, out ret);
if (!ret)
{
//"系统已经启动"
Environment.Exit(0);
}
2. 退出时
public App()
{
Exit += App_Exit;
}
private void App_Exit(object sender, ExitEventArgs e)
{
try
{
Process.GetCurrentProcess().Kill();
}
catch (Exception ex) {}
}
3. 异常捕获
public App()
{
Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}
/// <summary>
/// UI线程上未捕获的异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//MessageWindow.ShowMsg("我们很抱歉,当前应用程序遇到一些问题.." + e.Exception + "意外的操作", false);
Common.WriteLog.Error("未捕获到的UI线程异常!", e.Exception);
e.Handled = true;
}
/// <summary>
/// 捕获应用程序域中发生的异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Common.WriteLog.Error("未捕获到的非UI线程异常!", (System.Exception)e.ExceptionObject);
}
/// <summary>
/// 当出错的任务的未观察到的异常将要触发异常升级策略时发生,默认情况下,这将终止进程。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
Common.WriteLog.Error("未捕获到的Task任务异常!", e.Exception);
e.SetObserved();
}
以下内容来自 https://www.cnblogs.com/leolion/p/4801165.html:
"
WPF程序中,对于异常的捕获一般使用try/catch块。就像程序中的bug一样,很难保证程序中所有的异常都能够通过try/catch捕获。如果异常没有被捕获,轻则影响用户体验,严重时会导致数据丢失。WPF中提供了Application.DispatcherUnhandledException事件和AppDomain.UnhandledException事件,通过注册这两个事件,我们可以对未经处理的全局异常集中执行自定义处理。
对于在主UI线程上运行的代码未处理的每个异常,Application都将引发一个 DispatcherUnhandledException。当您处理一个来自 DispatcherUnhandledException 的未经处理的异常,并且不希望 WPF 继续处理该异常时,需要将 Handled 属性设置为 true。通俗的讲,如果不希望应用程序崩溃,我们需要将Handled 属性设置为 true。但不是所有的异常都可恢复,如果异常是FileNotFoundException,程序可以在处理异常后继续运行,如果异常是StackOverflowException,则无法再继续运行,即将关闭。
对于在任何线程中的任何未处理的异常,以及无论什么应用程序域中的异常都将引发UnhandledException。如果UI线程中的异常未处理,也会引发UnhandledException。从.NET Framework 4开始,损坏进程状态异常将不引发该事件,如堆栈溢出,或者是访问冲突。因为默认情况下,公共语言运行时 (CLR) 并不把这些异常输出到托管代码,且不为它们调用 try/catch 块。
"
WPF 基础 - 启动与退出及异常捕获的更多相关文章
- (转)iOS7界面设计规范(3) - UI基础 - 启动与退出
周二晚间来第三发,搞得好像今天是周六的赶脚.发掉之后再奖励自己一点冰啤酒吧,然后扑床去.天气热起来了,各位注意防暑降温呗.走起. 重要:这是针对于正在开发中的API或技术的预备文档(预发布版本).虽然 ...
- WPF异常捕获,并使程序不崩溃!
原文:WPF异常捕获,并使程序不崩溃! 在.NET中,我们使用try-catch-finally来处理异常.但,当一个Exception抛出,抛出Exception的代码又没有被try包围时,程序就崩 ...
- .Net基础篇_学习笔记_第六天_异常捕获复习及断点调试
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- .NET 基础 一步步 一幕幕[数组、集合、异常捕获]
数组.集合.异常捕获 数组: 一次性存储多个相同类型的变量. 一维数组: 语法: 数组类型[] 数组名=new 数组类型[数组长度]; 声明数组的语法: A.数据类型 [] 数组名称= new 数据类 ...
- Flask基础(08)-->错误捕获(异常捕获)
错误捕获(异常捕获) from flask import Flask from flask import abort app = Flask(__name__) @app.route('/demo1' ...
- .Net下的全局异常捕获问题
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
- iOS异常捕获
文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进⼀一步分析 五. demo地址 六. 参考文献 前言 ...
- 异常捕获 崩溃 Bugly ACRC 简介 总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3
异常捕获 异常:程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 影响:整个程序无法再正常运行 异常的结构 异常的类型 NameError 异常的信息 ...
随机推荐
- Nestjs入门学习教程
初次接触Nest,有问题欢迎指出: 简介 NestJS是一个用于构建高效.可扩展的Node.js服务器端应用程序的开发框架.简单来说是一款Node.js的后端框架. 它利用JavaScript的渐进增 ...
- 手把手教你通过SQL注入盗取数据库信息
目录 数据库结构 注入示例 判断共有多少字段 判断字段显示位置 显示出登录用户和数据库名 查看所有数据库 获取对应数据库的表 获取对应表的字段名称 获取用户密码 SQL注入(SQL Injection ...
- ELK Stack 介绍 & Logstash 日志收集
ELK Stack 组成 Software Description Function E:Elasticsearch Java 程序 存储,查询日志 L:Logstash Java 程序 收集.过滤日 ...
- 易漏的PEP8语法规范
import后定义函数的话, 两个空白行. 函数参数内'='左右不加空格. 在写函数说明时, 三引号得是三个双引号.
- React & update state with props & Object.assign
React & update state with props & Object.assign Object.assign({}, oldObj, newObj) https://re ...
- USDN代币的特点
USDN是NGK公链发行的算法型稳定币,采用智能合约发行,通过智能合约的透明化,能够让市场USND持有者获得算法稳定的背书.USDN是一种锚定全球通用的代币,更是连接全球数字经济的通用数字代币.USD ...
- NGK公链:夯实基础设施 实现产业大规模应用
当前,区块链已经成为全球技术角逐的前沿,大国及科技巨头竞相在该领域布局,引导区块链服务实体经济,激发市场经济活力.据市场相关研究机构预测,2020年,基于区块链的业务将达到1000亿美元. 对于区块链 ...
- NGK的内存为何如此的火爆?
要说最近最受关注的公链,当属NGK了.NGK代币在迎来43倍暴涨之后似乎进入了一个平板期,这让很多投资者的热情冷却了一半,就在大家以为对NGK放弃信心时,NGK又突然爆出了一个新的炒作点:NGK内存( ...
- VS Code使用Git可视化管理源代码详细教程
前言: 随着VS Code的功能和插件的不断强大和完善,它已经成为了我们日常开发中一个必不可缺的伙伴了.在之前我曾经写过一篇SourceTree使用教程详解(一个git可视化管理神器,想要了解的话可以 ...
- django学习-23.admin管理后台的数据表数据的自定义展示
目录结构 1.前言 2.自定义设置一张指定的数据表的列表展示内容 2.1.第一步:如果我们想让数据表[hello_person]里面的表字段值全部展示出来,需在应用[hello]里的[admin.py ...