【异常处理】捕获日志类的用法

      由于在公司我和另外一名同事负责系统后台代码的编写,对于线程异常的处理比较重视,之前的异常处理方法基本上就是print出错误信息,打印到堆栈,或者在catch中处理,或者throw到上一级别,有的时候异常很难发现,后来同时和我说将异常写到日志当中,就可以解决这些问题,于是小菜我也亲自试了一把,作如下总结:

      由于没法演示启动页面以及运行效果,我先将其写到控制台当中,新建一个LogTest类,在Main方法当中新建两个线程:

<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>
      这段代码在实际应用当中就要放到可能出现异常的地方,包括大量运算段、复杂逻辑段当中,上述例子中,我在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("调用堆栈:\n" + 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:\Leke\Log\Log\Program.cs:行号 36”。

     3、关闭StreamWriter;


     执行完我写的两个异常之后,错误日志截图:

        

      it's succeed.

       

       


       



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
在使用 SignalR 进行实时通信时,可能会遇到一些异常情况,如连接断开、超时等。为了保证应用程序的稳定性和可靠性,我们需要捕获这些异常并进行适当的处理。 在 SignalR 中,可以通过注册异常处理程序来捕获异常。例如,可以在 Hub 的构造函数中注册异常处理程序: ```csharp public class MyHub : Hub { public MyHub() { GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule()); } // other methods } ``` 其中,ErrorHandlingPipelineModule 是一个自定义的异常处理模块,可以在该模块中实现对异常的处理。例如,可以将异常信息记录到日志中,或者返回一个错误提示给客户端。 下面是一个简单的异常处理模块的示例: ```csharp public class ErrorHandlingPipelineModule : HubPipelineModule { protected override void OnIncomingError(ExceptionContext exceptionContext, IHubIncomingInvokerContext invokerContext) { // 记录异常信息到日志中 Log.Error(exceptionContext.Error); // 返回一个错误提示给客户端 invokerContext.HubContext.Clients.Caller.onError(exceptionContext.Error.Message); // 标记异常已被处理 exceptionContext.Handled = true; } } ``` 在该异常处理模块中,我们重写了 OnIncomingError 方法,该方法会在发生异常时被调用。在该方法中,我们可以实现对异常的处理。在上面的示例中,我们将异常信息记录到日志中,并返回一个错误提示给客户端。同时,我们设置了 exceptionContext.Handled 属性为 true,这意味着异常已被处理,不会再次抛出到上层调用栈中。 除了在 Hub 中注册异常处理程序外,还可以在全局范围内注册异常处理程序。例如,可以在 Global.asax.cs 文件的 Application_Start 方法中注册全局异常处理程序: ```csharp protected void Application_Start() { GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule()); } ``` 通过以上的方式,我们可以捕获 SignalR 中的异常并进行适当的处理,从而保证应用程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值