1. [代码]函数:将异常打印到LOG文件     跳至 [1] [2] [4] [全屏预览]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/// <summary>
/// 将异常打印到LOG文件
/// </summary>
/// <param name="ex">异常</param>
/// <param name="LogAddress">日志文件地址</param>
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 sw = new StreamWriter(LogAddress, true);
    sw.WriteLine("当前时间:" + DateTime.Now.ToString());
    sw.WriteLine("异常信息:" + ex.Message);
    sw.WriteLine("异常对象:" + ex.Source);
    sw.WriteLine("调用堆栈:\n" + ex.StackTrace.Trim());
    sw.WriteLine("触发方法:" + ex.TargetSite);
    sw.WriteLine();
    sw.Close();
}

2. [代码]调用方法

1
2
3
4
5
6
7
8
try
{
    throw new Exception("测试异常");
}
catch (Exception ex)
{
    WriteLog(ex);
}

3. [图片] 测试异常.png

4. [代码]多线程调用函数,需要在函数体内部用到lock关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
static void Main(string[] args)
{
    Thread th1 = new Thread(new ParameterizedThreadStart(MakeException));
    Thread th2 = new Thread(new ParameterizedThreadStart(MakeException));
 
    th1.Start("Thread1");
    th2.Start("Thread2");
}
 
/// <summary>
/// 制造异常
/// </summary>
/// <param name="Tag">传入标签</param>
public static void MakeException(object Tag)
{
    while (true)
    {
        try
        {
            throw new Exception("测试异常");
        }
        catch (Exception ex)
        {
            WriteLog(ex, Tag.ToString());
        }
    }
}
 
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("调用堆栈:\n" + ex.StackTrace.Trim());
        sw.WriteLine("触发方法:" + ex.TargetSite);
        sw.WriteLine();
        sw.Close();
    }
}
1
2
3
4
if (!Directory.Exists(sPath))
{
     Directory.CreateDirectory(sPath);
}

C# 打印异常的更多相关文章

  1. Java如何打印异常的堆栈?

    在Java编程中,如何打印异常的堆栈? 此示例显示如何使用异常类的printStack()方法打印异常的堆栈. package com.yiibai; public class PrintStackT ...

  2. Slf4j打印异常的堆栈信息

    一.前言 直接用logger.info("异常信息为:"+e)或者logger.info(e.getMessage())只能记录到异常的描述信息,却没有其异常具体发生在哪一行代码. ...

  3. Springboot + SLF4j + Log4j2 打印异常日志时,耗时要5-6秒

    1.使用jps -l 查看springboot项目的进程ID 2.使用命令jstack -l 进程ID > log.txt 打印堆栈信息到文件,内容如下: "http-nio-8065 ...

  4. 在error日志打印异常

    在日志中打印异常,经常会看到以下的写法: logger.error(e.getMessage()); 或者是: e.printStackTrace(); 这两种其实都不太好. e.getMessage ...

  5. [python]打印异常信息的不同方式

    异常捕获 try: execpt Exception as e: print(str(e)) 打印异常信息的方式 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常 ...

  6. 存储过程——异常捕获&打印异常信息

    目录 0. 背景说明 1. 建立异常信息表ErrorLog 2. 建立保存异常信息的存储过程 3. 建立在SQL Server中打印异常信息的存储过程 4. 建立一个用于测试的存储过程抛出异常进行测试 ...

  7. Python traceback 模块, 打印异常信息

    Python感觉是模仿Java, 到处都需要加try..catch.... 这里记录一下用法,方便后续使用. # -*- coding:utf-8 -*- import os import loggi ...

  8. 一个日志模板,从traceback打印异常受启发做的模板,可被pycharm esclip 等ide识别和跳转

    之前发过日志,再增加一种模板. logging.Formatter('%(asctime)s - %(name)s - File "%(pathname)s", line %(li ...

  9. jvm不打印异常栈

    生产环境抛异常,但却没有将堆栈信息输出到日志,确认打印日志方法正确logger.error("somthing error", ex); JVM启动参数加上-XX:-OmitSta ...

随机推荐

  1. PLSQL_闪回删除FlashBack Delete表误删除如何进行恢复(案例)

    2014-07-02 Created By BaoXinjian

  2. 白书 4.1.2 模运算的世界 P291

    1.逆元 这里有个注意事项要说,就是当要求 (a-b)%m 的时候要注意不能直接 (a%m-b%m)%m 原因是得出的值有可能是负数,所以 (a%m-b%m+m)%m 才是正确的. //x,y是引用 ...

  3. Python 向上取整的算法

    一.初衷: 有时候我们分页展示数据的时候,需要计算页数.一般都是向上取整,例如counts=205 pageCouts=20 ,pages= 11 页. 一般的除法只是取整数部分,达不到要求. 二.方 ...

  4. 网页设计中常用的Web安全字体

    但多数情况下,考虑各个因素的影响我们还是在尽量充分利用这些默认调用的字体实现CSS的编写,这里整理了19个Web安全字体,让你无需任何顾虑的情况下畅快使用. 1,  Arial 微软公司的网页核心字体 ...

  5. No matching bean of type [xx] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency

    这个看起来很弱爆的问题其实是因为其他的配置文件中已经出现了为xx定义好的注入.如果用@Autowired就会得到上面的错误 , 但是用@Resource的时候就会看到类似下面的错误 Bean name ...

  6. 解析wamp的php.ini设置不生效的原因

    你是否有过这样的经历,当你打开wamp的php.ini,并进行参数修改之后.再回到命令去运行你的php脚本,却发现你的设置居然不生效? 如果有这样的情况,那你得先了解php的两种运行运行环境,一个在命 ...

  7. js上移、下移、置顶、置底功能实现

    实现页面上列表内容上移.下移.置顶.置底 功能,主要实现思路是节点操作,比如说:上移,直接把点击项移动到前一个节点,以此类推,当然实际代码实现还要加些判断,如当前点击操作项是否已经是置底或置底了,如果 ...

  8. 20145305《JAVA程序设计》实验二

    实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验要求 1.没有Linux基础的同学 ...

  9. [ActionScript 3.0] as3可以通过CDATA标签声明多行字符串

    var str:String=<![CDATA[YANSHUANGPING yanshuangping yanshuangping ]]>; trace(str); var myname: ...

  10. CentOS 的网络配置

    1, ifcfg-ethX, 设置对应网口的IP等信息, 比如第一个网口, 那么vim /etc/sysconfig/network-scripts/ifcfg-eth0,配置例子: DEVICE=& ...