转载自 http://blog.csdn.net/zzh920625/article/details/52304848
两个线程:
- <span style="font-family:Microsoft YaHei;font-size:14px;">static void Main(string[] args)
- {
- //实例化带参数的线程的写法 - zzh - 2016年8月22日
- Thread th1 = new Thread(new ParameterizedThreadStart(MakeException));
- Thread th2 = new Thread(new ParameterizedThreadStart(MakeException));
- //开启线程 - zzh - 2016年8月22日
- th1.Start("Thread1");
- th2.Start("Thread2");
- }</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">static void Main(string[] args) { //实例化带参数的线程的写法 - zzh - 2016年8月22日 Thread th1 = new Thread(new ParameterizedThreadStart(MakeException)); Thread th2 = new Thread(new ParameterizedThreadStart(MakeException)); //开启线程 - zzh - 2016年8月22日 th1.Start("Thread1"); th2.Start("Thread2"); }</span>
然后填充线程调用的MakException()方法:
- <span style="font-family:Microsoft YaHei;font-size:14px;">/// <summary>
- /// 制造异常 - zzh - 2016年8月23日
- /// </summary>
- /// <param name="Tag">传入标签</param>
- public static void MakeException(object Tag)
- {
- try
- {
- //异常操作一:直接throw异常信息
- throw new Exception("测试异常");
- //异常操作二:写一个除以零的错误代码段
- int a = 1, b = 0, c;
- c = a / b;
- }
- catch (Exception ex)
- {
- WriteLog(ex, Tag.ToString()); //该方法还可以传入自己想要打印错误文本的路径
- }
- }</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">/// <summary> /// 制造异常 - zzh - 2016年8月23日 /// </summary> /// <param name="Tag">传入标签</param> public static void MakeException(object Tag) { try { //异常操作一:直接throw异常信息 throw new Exception("测试异常"); //异常操作二:写一个除以零的错误代码段 int a = 1, b = 0, c; c = a / b; } catch (Exception ex) { WriteLog(ex, Tag.ToString()); //该方法还可以传入自己想要打印错误文本的路径 } }</span>
这段代码在实际应用当中就要放到可能出现异常的地方,包括大量运算段、复杂逻辑段当中,上述例子中,我在try块当中写了两个异常,catch中通过WriteLog()方法来抓取他们,传入参数Tag.
接下来实现WriteLog方法:
- <span style="font-family:Microsoft YaHei;font-size:14px;">public static object locker = new object();
- /// <summary>
- /// 将异常打印到LOG文件
- /// </summary>
- /// <param name="ex">异常</param>
- /// <param name="LogAddress">日志文件地址</param>
- /// <param name="Tag">传入标签(这里用于标识函数由哪个线程调用)</param>
- public static void WriteLog(Exception ex, string Tag = "", string LogAddress = "")
- {
- lock (locker)
- {
- //如果日志文件为空,则默认在Debug目录下新建 YYYY-mm-dd_Log.log文件
- if (LogAddress == "")
- {
- LogAddress = Environment.CurrentDirectory + '\' +
- DateTime.Now.Year + '-' +
- DateTime.Now.Month + '-' +
- DateTime.Now.Day + "_Log.log";
- }
- //把异常信息输出到文件
- StreamWriter sw = new StreamWriter(LogAddress, true);
- sw.WriteLine(String.Concat('[', DateTime.Now.ToString(), "] Tag:" + Tag));
- sw.WriteLine("异常信息:" + ex.Message);
- sw.WriteLine("异常对象:" + ex.Source);
- sw.WriteLine("调用堆栈: " + ex.StackTrace.Trim());
- sw.WriteLine("触发方法:" + ex.TargetSite);
- sw.WriteLine();
- sw.Close();
- }
- }</span>
<span style="font-family:Microsoft YaHei;font-size:14px;">public static object locker = new object(); /// <summary> /// 将异常打印到LOG文件 /// </summary> /// <param name="ex">异常</param> /// <param name="LogAddress">日志文件地址</param> /// <param name="Tag">传入标签(这里用于标识函数由哪个线程调用)</param> public static void WriteLog(Exception ex, string Tag = "", string LogAddress = "") { lock (locker) { //如果日志文件为空,则默认在Debug目录下新建 YYYY-mm-dd_Log.log文件 if (LogAddress == "") { LogAddress = Environment.CurrentDirectory + '\' + DateTime.Now.Year + '-' + DateTime.Now.Month + '-' + DateTime.Now.Day + "_Log.log"; } //把异常信息输出到文件 StreamWriter sw = new StreamWriter(LogAddress, true); sw.WriteLine(String.Concat('[', DateTime.Now.ToString(), "] Tag:" + Tag)); sw.WriteLine("异常信息:" + ex.Message); sw.WriteLine("异常对象:" + ex.Source); sw.WriteLine("调用堆栈: " + ex.StackTrace.Trim()); sw.WriteLine("触发方法:" + ex.TargetSite); sw.WriteLine(); sw.Close(); } }</span>
1、考虑到错误日志的路径问题,默认路径Environment.CurrentDirectory(项目的bin文件夹下),也可以通过传入第三个参数直接跳过生成存储路径的过程。
2、引入using System.IO,通过StreamWriter实例化类,传入Log生成地址,在文件中打印”异常信息(ex.Message)”,这个东西也是我在之前仅仅写到的、打印异常引发的对象(ex.Source);“触发方式”,说明在哪个方法调用过程中除了问题,提升具体的方法;”调用堆栈(ex.StackTrace)",打印出异常代码在具体的哪个文件、哪一行当中
“调用堆栈:在 Log.Program.MakeException(Object Tag) 位置 g:LekeLogLogProgram.cs:行号 36”。
3、关闭StreamWriter;
执行完我写的两个异常之后,错误日志截图: