美文网首页通往成功之路
C#将运行异常写成日志文件

C#将运行异常写成日志文件

作者: 此十八 | 来源:发表于2018-06-06 15:10 被阅读7次

 我们在程序编写中,一些尚未测试出来的错误很可能在用户使用的过程中报异常,让用户来面向异常这是不友好的。将异常写成日志既不给用户造成压力又方便维护人员调改代码

思维导图

显示并忽略

        这个是最简单的用一个try。。。catch。。。finally即可,这也是身为一个专业的程序员最不靠谱的

写成日志文件

1)EventLog类

格式

[csharp] view plain copy

using System.Diagnostics;//引用空间名称  

EventLog errLog =new EventLog();  

errLog.Source =”事件的源名称";  

errLog.WriteEntry("写入日志文件失败,原因:" + ex.Message);  

Demo

[csharp] view plain copy

using System.Text;  

using System.Threading.Tasks;  

using System.Diagnostics;  

namespace ConsoleApplication1//引入命名空间  

{  

class Program  

    {  

static void Main(string[] args)  

        {  

EventLog log =new EventLog();  

try  

            {  

log.Source ="系统2";  //在查看系统日志能够迅速找到有问题的软件源头  

log.WriteEntry("处理信息1", EventLogEntryType.Information);  

log.WriteEntry("处理信息2", EventLogEntryType.Information);  

throw new System.IO.FileNotFoundException("readme.txt文件未找到");  

            }  

catch (System.IO.FileNotFoundException exception)  

            {  

log.WriteEntry("处理信息2", EventLogEntryType.Error);  

            }  

        }  

    }  

}  

效果图

 在Windows日志中查看系统自带的,具体打开控制面板——工具管理——事件查看器——Windows日志——应用程序

 双击进去即可看见错误了

需要注意的:

 1)一定要引入命名空间diagnostics

 2)source属性一定要写且命名规范方便查询

 3)一定要用管理员权限运行,不然会报下面的错误

2)自定义类

模板

[csharp] view plain copy

///   

/// 将异常打印到LOG文件  

///   

/// 异常  

/// 日志文件地址  

public static void WriteLog(Exception ex, string LogAddress = "")  

{  

//如果日志文件为空,则默认在Debug目录下新建 YYYY-mm-dd_Log.log文件  

if (LogAddress == "")  

    {  

LogAddress = Environment.CurrentDirectory +'\\' +  

DateTime.Now.Year +'-' +  

DateTime.Now.Month +'-' +  

DateTime.Now.Day +"_Log.log";  

    }  

//把异常信息输出到文件  

StreamWriter fs =new StreamWriter(LogAddress, true);  

fs.WriteLine("当前时间:" + DateTime.Now.ToString());  

fs.WriteLine("异常信息:" + ex.Message);  

fs.WriteLine("异常对象:" + ex.Source);  

fs.WriteLine("调用堆栈:\n" + ex.StackTrace.Trim());  

fs.WriteLine("触发方法:" + ex.TargetSite);  

    fs.WriteLine();  

    fs.Close();  

}  

Demo

[csharp] view plain copy

using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Text;  

using System.Threading.Tasks;  

using System.IO;  

namespace ConsoleApplication2  

{  

class Program  

    {  

static void Main(string[] args)  

        {  

int i;  

int j;  

try//随意写了一个有错误的小程序,错误是除数为零  

            {  

                i = 0;  

                j = 2 / i;  

            }  

catch (Exception ex)  

            {  

WriteLog(ex);//调用自己写的方法,需要传参,如果第二个为空则默认到debug下,参数的具体格式参照下面的注释  

            }  

finally //不受错误影响继续运行  

            {  

                j = 2 / 1;  

                Console.Write(j);  

                Console.ReadLine();  

            }  

        }  

///   

/// 将异常打印到LOG文件  

///   

/// 异常  

/// 日志文件地址  

public static void WriteLog(Exception ex, string LogAddress = "")  

        {  

//如果日志文件为空,则默认在Debug目录下新建 YYYY-mm-dd_Log.log文件  

if (LogAddress == "")  

            {  

LogAddress = Environment.CurrentDirectory +'\\' +  

DateTime.Now.Year +'-' +  

DateTime.Now.Month +'-' +  

DateTime.Now.Day +"_Log.log";  

            }  

//把异常信息输出到文件,因为异常文件由这几部分组成,这样就不用我们自己复制到文档中了  

StreamWriter fs =new StreamWriter(LogAddress, true);  

fs.WriteLine("当前时间:" + DateTime.Now.ToString());  

fs.WriteLine("异常信息:" + ex.Message);  

fs.WriteLine("异常对象:" + ex.Source);  

fs.WriteLine("调用堆栈:\n" + ex.StackTrace.Trim());  

fs.WriteLine("触发方法:" + ex.TargetSite);  

            fs.WriteLine();  

            fs.Close();  

        }  

    }  

}  

效果图

        看起来是不是很爽

二者的比较

        首先两个都是比较好用方便的,但是相对于灵活性而言自定义类略胜一筹

相关文章

网友评论

    本文标题:C#将运行异常写成日志文件

    本文链接:https://www.haomeiwen.com/subject/lrbbsftx.html