Foxtable(狐表)用户栏目专家坐堂 → [求助]抛异常问题


  共有5376人关注过本帖树形打印复制链接

主题:[求助]抛异常问题

帅哥哟,离线,有人找我吗?
ajie5211
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:815 积分:5616 威望:0 精华:1 注册:2015/11/28 14:00:00
[求助]抛异常问题  发帖心情 Post By:2022/7/12 11:10:00 [只看该作者]

网页服务端中,希望记录服务器的异常信息,同时因为是服务端,所以不要显示异常窗口,还要及时给前端一个服务端异常提示,不要让前端直接等待死机。

如果用BeforeShowErrorMessage事件,这时不知道怎么给前端回写服务端异常,如果用

try

 

Catch ex As Exception

    Functions.Execute("错误日志", ex)
    e.WriteString("服务端异步异常,请联系管理员!") 

End Try

这时的问题是,BeforeShowErrorMessage事件不起作用,只能靠Functions.Execute("错误日志", ex)这个内部函数,但是这样写的异常日志没有“Event:   字符型,返回发生错误的事件名称,如果错误发生在自定义函数中,则返回函数名”,造成错误无法排查,不知道有啥办法能处理。

错误日志内部函数如下:

Dim v As Exception = args(0)
Dim msg As String
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
'msg = v.Event & ":" & msg
'Functions.Execute("错误日志", msg)
If FileSys.DirectoryExists(ProjectPath & "log") = False Then '如果目录不存在
    FileSys.CreateDirectory(ProjectPath & "log")'创建
End If
For Each File As String In FileSys.GetFiles(ProjectPath & "log")
    Dim ifo As New FileInfo(File) 
    If ifo.CreationTime.AddDays(16) < Date.Now Then
        FileSys.DeleteFile(File, 2, 2) '则彻底删除之
    End If 
Next
Output.Logs("AppLogging").Add(Format( Date.Now, "yyyy-MM-dd HH:mm:ss.ffff") & vbCrLf & msg)
Output.Logs("AppLogging").Save(ProjectPath & "log\" & Format(Date.Today, "yyyyMMdd") & "log.txt", True) '日志位于当前项目目录里
Output.Logs("AppLogging").Clear


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107783 积分:548260 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/7/12 11:29:00 [只看该作者]

加个参数,把函数名放进去

try

 

Catch ex As Exception

    Functions.Execute("错误日志", ex ,"xx函数")
    e.WriteString("服务端异步异常,请联系管理员!") 

End Try


------------

msg = args(1) & ":" & msg


 回到顶部
帅哥哟,离线,有人找我吗?
ajie5211
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:815 积分:5616 威望:0 精华:1 注册:2015/11/28 14:00:00
  发帖心情 Post By:2022/7/12 11:34:00 [只看该作者]

这个还真不是好方案,我现在把这个try直接放在了HttpRequest事件第一道里,try里面去写的各个内部函数生成网页,里面有些还会用表事件啥的,如果按你这整法,哪每个内部函数,每个事件哪里都要去写一下try抛异常了,会非常麻烦的。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107783 积分:548260 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/7/12 11:41:00 [只看该作者]

这个没有办法。

 回到顶部
帅哥哟,离线,有人找我吗?
ajie5211
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:815 积分:5616 威望:0 精华:1 注册:2015/11/28 14:00:00
  发帖心情 Post By:2022/7/12 14:13:00 [只看该作者]

反复调试,终于解决这个问题了,定义一个全局变量,Public _httpe As RequestEventArgs

HttpRequest事件里,一开始就把有e参数传给_httpe,即_httpe=e

BeforeShowErrorMessage事件里,e.Cancel = true 前面把错误信息写入日志,发送管理员邮件,并加入

_httpe.WriteString("服务端异步异常,请联系管理员!") 

这时就可以直接回应前端了。


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107783 积分:548260 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/7/12 14:23:00 [只看该作者]

不合理,HttpRequest事件是所有客户端共用的。这样可能会导致A用户出错,然后把错误发给B用户了

 回到顶部
帅哥哟,离线,有人找我吗?
ajie5211
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:815 积分:5616 威望:0 精华:1 注册:2015/11/28 14:00:00
  发帖心情 Post By:2022/7/12 14:51:00 [只看该作者]

用try也不好啊,先不说代码变复杂这些事,因为是内部函数套内部函数,要想错误显示完整,就需要每个事件,每个内部函数都try一下,这样就会发生,一但有报错,就一层一层的try回来,系统效率是不是低很多了?

按这算法,这事没个好方案。


 回到顶部