狐表Web自定义报错提醒,捕获分析,尤其针对“未将对象引用设置到对象的实例”的莫名其妙错误

发表日期: 2022-06-20

1需求说明

在做web开发时,服务器偶尔遇到这个错误。但是平时自己开发又没测试出这个问题。

image.png

这个错误有2个蛋疼的地方:

  1. 没有告诉你什么事件触发的

  2. 它弹窗后会导致服务器主线程被卡主,导致整个web系统用不了

2错误根源

为什么只在web开发里常见呢?

  1. 因为它99%的来源就是e.Values、e.PostValues、e.GetValues引用了不存在的变量。还有就是在JObject里,也引用了不存在的东西。

  2. 刚好web的对象还严格区分大小写,很多人不小心就直接引用了不存在的东西,于是就报错了。

  3. web是公开访问的,可能有些爬虫或者恶意请求,构造了不合法的参数,于是狐表接收就出错了。


       更深层的原因:因为web传递过来的对象,狐表的编辑器不能提前判断(就算你用java的编辑器也一样)。所以你写代码的时候,引用了什么,它都无法报出错误。

       所以这种排查基本只能靠检查自己的代码,并没有什么特别好的方法,不过我们可以通过下面的方式,尽可能增加日志跟踪,方便定位出问题。

3解决方法

3.1屏蔽错误

在BeforeShowErrorMessage屏蔽错误,防止堵塞主线程,并进一步加工处理

If User.Type <> UserTypeEnum.Developer  Then
    Functions.Execute("LogText",e)
    e.Cancel = True
End If

file

3.2加工错误信息

添加一个内部函数LogText

'通过 Functions.Execute("LogText","你的错误信息")使用
Dim e As Object = Args(0)
Dim msg As String
If e.Gettype().ToString() ="Foxtable.ShowErrorMessageEventArgs" Then
    msg &= "报错定位:" & e.Event & vbcrlf
    Dim v As Object  = e.ex    
    If Typeof v Is Exception Then '如果是Exception的异常类型,则递归获取所有的异常堆栈        
        Do While v IsNot Nothing
            msg &= v.Message &  vbcrlf & v.StackTrace & vbcrlf
            v = v.InnerException
        Loop
    End If
Else '其它情况只能传入错误的文本内容
    msg = e
End If

Output.Logs("AppLogging").Add(Format( Date.Now,"yyyy-MM-dd HH:mm:ss.ffff") & vbCrLf & msg & vbCrLf )
Output.Logs("AppLogging").Save(ProjectPath & "ErrorLog.txt",True) '日志位于当前项目目录里
Output.Logs("AppLogging").Clear

3.3查看错误日志

这样在项目根目录就会有个错误日志文件,你可以手动打开,也可以通过代码快速打开

Dim path As String = ProjectPath & "ErrorLog.txt"
If FileSys.FileExists(path) Then
    Dim Proc As New Process '定义一个新的Process
    Proc.File = path '指定要打开的文件
    Proc.Start()
Else
    MessageBox.show("无错误日志")    
End If

file


这是我一些项目的实战效果:

file

file

随着你积累的错误增加,你很快会发现是哪里出错,逐步迭代,很快你会发现能达到几个月都是0报错

file

3.4主动添加日志的方法

file

你可以在你觉得有问题的地方,提前插入日志,更方便跟踪检查



随便看看

Copyright © 2016-2022 江门蓬江区华越科技公司 版权所有 | 承接软件定制开发,欢迎联系
粤ICP备17073215号