在做web开发时,服务器偶尔遇到这个错误。但是平时自己开发又没测试出这个问题。
这个错误有2个蛋疼的地方:
没有告诉你什么事件触发的
它弹窗后会导致服务器主线程被卡主,导致整个web系统用不了
为什么只在web开发里常见呢?
因为它99%的来源就是e.Values、e.PostValues、e.GetValues引用了不存在的变量。还有就是在JObject里,也引用了不存在的东西。
刚好web的对象还严格区分大小写,很多人不小心就直接引用了不存在的东西,于是就报错了。
web是公开访问的,可能有些爬虫或者恶意请求,构造了不合法的参数,于是狐表接收就出错了。
更深层的原因:因为web传递过来的对象,狐表的编辑器不能提前判断(就算你用java的编辑器也一样)。所以你写代码的时候,引用了什么,它都无法报出错误。
所以这种排查基本只能靠检查自己的代码,并没有什么特别好的方法,不过我们可以通过下面的方式,尽可能增加日志跟踪,方便定位出问题。
在BeforeShowErrorMessage屏蔽错误,防止堵塞主线程,并进一步加工处理
If User.Type <> UserTypeEnum.Developer Then Functions.Execute("LogText",e) e.Cancel = True End If
添加一个内部函数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
这样在项目根目录就会有个错误日志文件,你可以手动打开,也可以通过代码快速打开
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
这是我一些项目的实战效果:
随着你积累的错误增加,你很快会发现是哪里出错,逐步迭代,很快你会发现能达到几个月都是0报错!
你可以在你觉得有问题的地方,提前插入日志,更方便跟踪检查