`namespace MyApp

{

///



/// App.xaml 的交互逻辑

///

public partial class App : Application

{

public App()

{

//UI线程异常

this.DispatcherUnhandledException += App_DispatcherUnhandledException;

//非UI线程异常

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

    }
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//可以记录日志并转向错误bug窗口友好提示用户
e.Handled = true;
try
{
PLogs.Error(e.Exception.TargetSite.ToString(), e.Exception.Message); }
catch (Exception)
{ }
MessageBox.Show("抱歉给您带来不便!消息:" + e.Exception.Message, "系统错误",MessageBoxButton.OK,MessageBoxImage.Error); }
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//可以记录日志并转向错误bug窗口友好提示用户
if (e.ExceptionObject is System.Exception)
{ Exception ex = (System.Exception)e.ExceptionObject;
try
{
PLogs.Error(ex.TargetSite.ToString(), ex.Message); }
catch (Exception)
{ }
MessageBox.Show("抱歉给您带来不便!消息:" + ex.Message, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error); }
}
}

}-----------------------------------------------分界线----------------------------------------------------- 日志: class PLogs

{

///



/// 普通日志

///

/// 类名

/// 日志记录

public static void Info(string className, string info)

{

WriteLog("INFO", className, info);

}

    /// <summary>
/// 警告日志
/// </summary>
/// <param name="className">类名</param>
/// <param name="info">日志记录</param>
public static void Warn(string className, string info)
{
WriteLog("WARN", className, info);
} /// <summary>
/// 错误日志
/// </summary>
/// <param name="className">类名</param>
/// <param name="info">日志记录</param>
public static void Error(string className, string info)
{
WriteLog("ERROE", className, info);
} /// <summary>
/// 写入日志
/// </summary>
/// <param name="className">类名</param>
/// <param name="infoLevel">日志级别</param>
/// <param name="info">日志记录</param>
private static void WriteLog(string className, string infoLevel, string info)
{
string logFilePath = AppDomain.CurrentDomain.BaseDirectory + "/logs";
if (!Directory.Exists(logFilePath))
{
Directory.CreateDirectory(logFilePath);
}
string logFileName = logFilePath + "/" + "log_" + DateTime.Now.ToString("yyyyMMdd") + ".log";
if (!File.Exists(logFileName))
{
File.Create(logFileName).Close();
}
string logFormat = string.Format("[ {0} ] {1} {2} {3}",
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
className, infoLevel, info);
StreamWriter sw = File.AppendText(logFileName);
sw.WriteLine(logFormat);
sw.Flush();
sw.Close();
}
}`

wpf 全局异常捕捉+简单日志记录的更多相关文章

  1. wpf 全局异常捕捉+错误日志记录+自动创建桌面图标

    /// /// 创建桌面图标 /// public static void CreateShortcutOnDesktop(string LnkName) { String shortcutPath ...

  2. .NET Core通过过滤器和中间件两种方式实现全局异常捕获和日志记录

    1.一共有五类过滤器IAsyncAuthorizationFilter  IAsyncResourceFilter   IAsyncActonFilter  IAsyncExceptionFilter ...

  3. android中全局异常捕捉

    android中全局异常捕捉 只要写代码就会有bug,但是我们要想办法收集到客户的bug.有第三方bugly或者友盟等可以收集.但是,android原生就提供了有关收集异常的api,所以我们来学习一下 ...

  4. Spring 全局异常捕捉

    Spring全局异常捕捉类 注解@ControllerAdvice package com.sicdt.sicsign.web.bill.controller; import org.springfr ...

  5. springboot(四)拦截器和全局异常捕捉

    github代码:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 全部 ...

  6. 在Spring Boot中添加全局异常捕捉提示

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...

  7. (5)全局异常捕捉【从零开始学Spring Boot】

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  9. Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...

随机推荐

  1. 列举python的可变类型和不可变类型

    可变的# unhashable type: 'list'# unhashable type: 'dict'# unhashable type: 'set'# 不可变# hashable type:st ...

  2. IDEA设置External Tools之Javap反编译字节码

    通过Jdk的命令javap可以反编译查看字节码,但是在使用idea的时候一直用命令行去操作不太好操作,而且因为idea会把class码 放在target里面,经常会忘记切换目录.这个时候idea的Ex ...

  3. linux 已放弃(吐核) (core dumped) 问题分析

    在运行自己写的 C 多线程程序是,出现:已放弃(吐核)  问题. 出现这种问题一般是下面这几种情况: 1.内存越界 2.使用的非线程安全的函数 3.全局数据未加锁保护 4.非法指针 5.堆栈溢出 也就 ...

  4. 强大的table组件-antd pro table

    概述 antd pro table antd pro table 的主要部分 表格显示的配置(绿色框内) 检索的配置(红色框内) 是否显示检索部分 检索的内容是如何生效的 工具栏的配置(黄色框内) 表 ...

  5. dgraph 使用简介

    dgraph 简介 dgraph 使用示例(基于 golang) golang client 安装 创建 schema 数据的 CURD 事务 总结 dgraph 简介 dgraph 是基于 gola ...

  6. Python解析yaml配置文件

    1.代码测试 import yaml fd = open('fileName.yaml', 'r') dict_tmp = yaml.load(fd) fd.close() print dict_tm ...

  7. html学习(1)

    认识html标签 1.<h1></h1>就是标题标签,<p></p>是段落标签,img是图片标签.  2.html中的标签一般都是成对出现的,分开始标签 ...

  8. Java改写重构第2版第一个示例

    写在前面 <重构:改善既有代码的设计>是一本经典的软件工程必读书籍.作者马丁·福勒强调重构技术是以微小的步伐修改程序. 但是,从国内的情况来而论,"重构"的概念表里分离 ...

  9. Consul 学习笔记—服务发现

    前言: 上一篇文章简单实用Consul试下服务注册,本篇继续学习Consul中的另外特性:服务发现.KV操作 :以及对上篇文章中存在的问题进行解决 问题解决 在上一篇文章中,注册服务提示检查失败. 通 ...

  10. WCF服务创建到发布(SqlServer版)

    在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构.该架构的项层为服务模型层. 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型. ...