WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印+全局异常捕捉

文章目录

  • 前言
  • 相关文章
  • Nlog配置
  • HandyControl配置
  • 简单使用
    • 显示效果
    • 文本内容
  • 全局异常捕捉
    • 异常代码
    • 运行结果

前言

我将简单的HandyControl的消息打印系统和Nlog搭配使用,简化我们的代码书写

相关文章

.NET 控制台NLog 使用

WPF-UI HandyControl 控件简单实战

C#更改控制台文字输出颜色

Nlog配置

这里安装这个文章配置就行了,但是彩色控制台打印需要修改一下,Console.Colorful官网好像被占用了,只能用原生的方法改颜色了

在这里插入图片描述

.NET 控制台NLog 使用

C#更改控制台文字输出颜色

using NLog.Config;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApp1.Utils
{public static class NLogHelper{private static Logger logger;static NLogHelper(){LogManager.Configuration = new XmlLoggingConfiguration(string.Format("{0}/NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString()));logger = NLog.LogManager.GetCurrentClassLogger();}public static void Debug(string msg){Console.WriteLine(msg);logger.Debug(msg);}public static void Info(string msg){ConsoleWirte(msg,ConsoleColor.Green);logger.Info(msg);}public static void Error(string msg){ConsoleWirte(msg, ConsoleColor.Red);logger.Error(msg);}public static void Warning(string msg){ConsoleWirte(msg, ConsoleColor.Yellow);logger.Warn(msg);}public static void ConsoleWirte(string msg,ConsoleColor color){Console.ForegroundColor = color;Console.WriteLine(msg);Console.ResetColor();}}
}

HandyControl配置

修改了一下HandyControl的打印逻辑

using HandyControl.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WpfApp1.Utils
{public static class MsgHelper{public enum MsgType { Info, Warn, Error, Success, Fatal }/// <summary>/// 打印消息/// </summary>/// <param name="msg"></param>/// <param name="type"></param>/// <param name="isGlobal"></param>public static void ShowMsg(string msg, MsgType type, bool isGlobal = false){if (isGlobal){switch (type){case MsgType.Info:NLogHelper.Info(msg);Growl.InfoGlobal(msg);break;case MsgType.Warn:NLogHelper.Warning(msg);Growl.WarningGlobal(msg);break;case MsgType.Error:NLogHelper.Error(msg);Growl.ErrorGlobal(msg);break;case MsgType.Success:NLogHelper.Info(msg);Growl.SuccessGlobal(msg);break;case MsgType.Fatal:NLogHelper.Error(msg);Growl.FatalGlobal(msg);break;}}else{switch (type){case MsgType.Info:NLogHelper.Info(msg);Growl.Info(msg);break;case MsgType.Warn:NLogHelper.Warning(msg);Growl.Warning(msg);break;case MsgType.Error:NLogHelper.Error(msg);Growl.Error(msg);break;case MsgType.Success:NLogHelper.Info(msg);Growl.Success(msg);break;case MsgType.Fatal:NLogHelper.Error(msg);Growl.Fatal(msg);break;}}}/// <summary>/// 询问回调/// </summary>/// <param name="msg"></param>/// <param name="callback"></param>/// <param name="isGlobal"></param>public static void Ask(string msg, Action<bool> callback, bool isGlobal = false){NLogHelper.Info(msg);if (isGlobal){Growl.AskGlobal(msg, isConfrimed =>{callback(isConfrimed);return true;});}else{Growl.Ask(msg, isConfrimed =>{callback(isConfrimed);return true;});}}/// <summary>/// 强制清空全部消息/// </summary>public static void CleanAll(){Growl.Clear();Growl.ClearGlobal();}public static void Info(string msg){NLogHelper.Info(msg);Growl.Info(msg);}public static void Warning(string msg){NLogHelper.Warning(msg);Growl.Warning(msg);}public static void Error(string msg) {NLogHelper.Error(msg);Growl.Error(msg);}public static void Fatal(string msg) {NLogHelper.Error(msg);Growl.Fatal(msg);}public static void Success(string msg) {NLogHelper.Info(msg);Growl.Success(msg);}public static void InfoGlobal(string msg){NLogHelper.Info(msg);Growl.InfoGlobal(msg);}public static void WarningGlobal(string msg){NLogHelper.Warning(msg);Growl.WarningGlobal(msg);}public static void ErrorGlobal(string msg){NLogHelper.Error(msg);Growl.ErrorGlobal(msg);}public static void FatalGlobal(string msg){NLogHelper.Error(msg);Growl.FatalGlobal(msg);}public static void SuccessGlobal(string msg){NLogHelper.Info(msg);Growl.SuccessGlobal(msg);}}
}

简单使用

在这里插入图片描述

显示效果

在这里插入图片描述

文本内容

在这里插入图片描述

全局异常捕捉

博客园 WPF 捕捉全局异常

将里面弹窗代码改成我们的弹窗代码

using System.Configuration;
using System.Data;
using System.Text;
using System.Windows;
using System.Windows.Threading;
using WpfApp1.Utils;namespace WpfApp1
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{public App(){//首先注册开始和退出事件this.Startup += new StartupEventHandler(App_Startup);this.Exit += new ExitEventHandler(App_Exit);}void App_Startup(object sender, StartupEventArgs e){//UI线程未捕获异常处理事件this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);//Task线程内未捕获异常处理事件TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;//非UI线程未捕获异常处理事件AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);}void App_Exit(object sender, ExitEventArgs e){//程序退出时需要处理的业务}void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e){try{e.Handled = true; //把 Handled 属性设为true,表示此异常已处理,程序可以继续运行,不会强制退出      MsgHelper.Error("UI线程异常:" + e.Exception.Message);//MessageBox.Show("UI线程异常:" + e.Exception.Message);}catch (Exception ex){//此时程序出现严重异常,将强制结束退出//MessageBox.Show("UI线程发生致命错误!");MsgHelper.FatalGlobal("UI线程发生致命错误!"+ex.ToString());}}void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e){StringBuilder sbEx = new StringBuilder();if (e.IsTerminating){sbEx.Append("非UI线程发生致命错误");}sbEx.Append("非UI线程异常:");if (e.ExceptionObject is Exception){sbEx.Append(((Exception)e.ExceptionObject).Message);}else{sbEx.Append(e.ExceptionObject);}//MessageBox.Show(sbEx.ToString());MsgHelper.Error(sbEx.ToString());}void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e){//task线程内未处理捕获MsgHelper.Error("Task线程异常:" + e.Exception.Message);//MessageBox.Show("Task线程异常:" + e.Exception.Message);e.SetObserved();//设置该异常已察觉(这样处理后就不会引起程序崩溃)}}}

异常代码

        public RelayCommand ErrorNull { get; set; }public RelayCommand ErrorTask { get; set; }public RelayCommand ErrorReadNull { get; set; }public List<int> Errors { get; set; }
......ErrorNull = new RelayCommand(() =>{Errors.Add(0);});ErrorReadNull = new RelayCommand(() =>{var res = File.ReadAllLines("读取文件");});ErrorTask = new RelayCommand(() =>{Task.Run(() =>{Errors.Add(0);});});

运行结果

也可以进入断点
在这里插入图片描述

在这里插入图片描述
但是有时候不能进入Task异常,有点奇怪,如果是Task异常需要自己主动Try,catch。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、gdb基本功能

文章目录 1、gdb1.1、运行1.1.1、程序入参 1.2、断点及观察点1.2.1、设置断点1.2.2、禁用、删除断点1.2.3、观察点 1.3、打印1.3.1、设定打印参数1.3.2、打印数据1.3.3、自动打印1.3.4、按照地址打印 linux下我现在接触到的常用调试工具如下. gbdgdbguicmake-tools gdb是最为通…

python+vue高校体育器材管理信息系统5us4g

优秀的高校体育馆场地预订系统能够更有效管理体育馆场地预订业务规范&#xff0c;帮助管理者更加有效管理场地的使用&#xff0c;有效提高场地使用效率&#xff0c;可以帮助提高克服人工管理带来的错误等不利因素&#xff0c;所以一个优秀的高校体育馆场地预订系统能够带来很大…

霹雳吧啦Wz《pytorch图像分类》-p2AlexNet网络

《pytorch图像分类》p2AlexNet网络基础及代码 一、零碎知识点1.过拟合2.使用dropout后的正向传播3.正则化regularization4.代码中所用的知识点 二、总体架构分析1.ReLU激活函数2.手算3.模型代码 三、训练花分类课程代码1.model.py2.train.py3.predict.py 一、零碎知识点 1.过拟…

Java多线程<三>常见的多线程设计模式

多线程的设计模式 两阶段线程终止 park方法 interrupted() 会让他失效。 使用volatile关键字进行改写 单例模式 双锁检测 保护性暂停 实现1&#xff1a; package threadBase.model;/*** author: Zekun Fu* date: 2022/5/29 19:01* Description:* 保护性暂停&#xff0c;* …

打砖块,Android休闲小游戏开发

A. 项目描述 《打砖块》是一款经典的休闲小游戏 &#xff0c;结合了经典的图形和音效&#xff0c;给玩家带来了轻松愉快的游戏体验。 该游戏操作简单易上手。玩家只需通过触摸屏幕控制底部的“拍子”左右移动&#xff0c;以反弹“小球” 击碎 顶部的砖块。玩家可以根据球的角度…

基于JAVA+SSM+VUE的前后端分离的大学竞赛管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着互联网技术的快速…

青龙面板的安装

一、安装docker 首先&#xff0c;需要在服务器上安装docker。 没有服务器的可以使用虚拟机&#xff0c;或申请一台三丰云的免费云服务器体验一下&#xff0c;独立IP地址&#xff0c;送免备案服务&#xff0c;可以满足基本的使用&#xff0c;三丰云上还有免费虚拟主机等其他免费…

ES6之解构赋值详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

Springboot整合MybatisPlus的基本CRUD

目录 前言1. 搭建项目2. 基本的CRUD 前言 发现项目框架是MybatisPlus的&#xff0c;由于个人使用该框架的CRUD比较少 对此学习过程中&#xff0c;从零到有开始搭建学习还是比较重要的&#xff0c;感悟会比较多 关于各个类的使用&#xff0c;可看如下文章&#xff1a; 剖析Ja…

Java—AOP案例-记录操作日志

简介&#xff1a;上一篇文章“JAVA语言—AOP基础”已经详细的介绍了AOP的各个功能接口&#xff0c;已经使用步骤&#xff0c;这篇文章就是基于此来做的一个小案例。案例的功能是记录登录的用户对于数据库表的相关信息进行增、删、查、改的操作记录下来&#xff0c;并且存储到数…

腾讯云轻量应用服务器详细介绍(全网超详细说明)

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

微信小程序开发系列-08自定义组件模版特性

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

点成案例 | 如何利用细胞计数仪在单细胞测序中评估细胞

一、概述 单细胞测序技术能够用来表征异常细胞群&#xff0c;分析稀有细胞和细胞图谱网络&#xff0c;发现异质性等。由于单细胞测序巨大的应用潜力&#xff0c;目前此技术正在经历爆炸性增长。然而&#xff0c;单细胞测序需要成本和时间的大量投资。为了确保时间和资源的投资…

正确的认识 字节码文件

上一篇中认识了JVM的基本组成&#xff0c;我们说JVM只认识字节码文件。那么在字节码文件进入JVM之前&#xff0c;我们先认识了解字节码文件长什么样&#xff0c;我们作为工程师不需要去死扣底层的理论知识&#xff0c;但是我们只是需要正确的打开字节码文件 知道里面有哪些部分…

[Angular] 笔记 22:ElementRef

chatgpt: ElementRef 是 Angular 中的一个类&#xff0c;它用于包装对 DOM 元素的引用。它允许开发者直接访问与 Angular 组件关联的宿主 DOM 元素。 当在 Angular 中需要直接操作 DOM 元素时&#xff0c;可以使用 ElementRef。通常情况下&#xff0c;最好避免直接操作 DOM&a…

Prism介绍

Prism介绍 Prism是一个框架&#xff0c;用于在WPF、Xamarin Forms、Uno Platform和WinUI中构建松散耦合、可维护和可测试的XAML应用程序。 设计目标 为了实现下列目的&#xff1a; 创建能够由模块组成的程序&#xff0c;这些模块能够被单独地编写、组装、部署&#xff0c;并且对…

十三:爬虫-Scrapy框架(下)

一&#xff1a;各文件的使用回顾 1.items的使用 items 文件主要用于定义储存爬取到的数据的数据结构&#xff0c;方便在爬虫和 Item Pipeline 之间传递数据。 items.pyimport scrapyclass TencentItem(scrapy.Item):# define the fields for your item here like:title scr…

jmeter函数助手-常用汇总

一.函数助手介绍 1.介绍及作用 介绍&#xff1a; jmeter自带的一个特性&#xff0c;可以通过指定的函数规则创建后进行调用该函数&#xff0c;在后续接口请求参数中进行调用 作用 &#xff08;1&#xff09;做参数化。 2.如何使用 jmeter工具栏-->工具-->函数助手…

LabVIEW在大型风电机组状态监测系统开发中的应用

LabVIEW在大型风电机组状态监测系统开发中的应用 风电作为一种清洁能源&#xff0c;近年来在全球范围内得到了广泛研究和开发。特别是大型风力发电机组&#xff0c;由于其常常位于边远地区如近海、戈壁、草原等&#xff0c;面临着恶劣自然环境和复杂设备运维挑战。为了提高风电…

DockerCompose - 容器编排、模板命令、compose命令、Pottainer 可视化界面管理(一文通关)

目录 一、DockerCompose 容器编排 1.1、简介 1.2、Docker-Compose 安装 1.2.1、在线安装 1.2.2、离线安装 1.3、docker-compose.yml 中的模板命令 前置说明 模板命令 1.4、DockerCompse 命令 前置说明 up down exec ps restart rm top pause暂停 和 unpause恢…