我们在程序编写中,一些尚未测试出来的错误很可能在用户使用的过程中报异常,让用户来面向异常这是不友好的。将异常写成日志既不给用户造成压力又方便维护人员调改代码
这个是最简单的用一个try。。。catch。。。finally即可,这也是身为一个专业的程序员最不靠谱的
格式
[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)一定要用管理员权限运行,不然会报下面的错误
模板
[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();
}
}
}
效果图
看起来是不是很爽
首先两个都是比较好用方便的,但是相对于灵活性而言自定义类略胜一筹
网友评论