Foxtable(狐表)用户栏目专家坐堂 → 自行捕获报错异常时,有没有办法捕获是什么自定义函数触发?


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

主题:自行捕获报错异常时,有没有办法捕获是什么自定义函数触发?

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


加好友 发短信
等级:六尾狐 帖子:1276 积分:7927 威望:0 精华:4 注册:2017/12/31 14:53:00
自行捕获报错异常时,有没有办法捕获是什么自定义函数触发?  发帖心情 Post By:2020/4/13 12:34:00 [只看该作者]

目前用官方推荐的方法自行捕获异常

①BeforeShowErrorMessage:

Functions.Execute("LogText",e.ex)


②内部函数:
Dim v  = 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
Else '其它情况只能传入错误的文本内容
    msg = v
End If
Output.Logs("AppLogging").Add(Format( Date.Now,"yyyy-MM-dd HH:mm:ss.ffff") & vbCrLf & msg & vbCrLf )
Output.Logs("AppLogging").Save(ProjectPath & "Mmsglog.txt",True) '日志位于当前项目目录里
Output.Logs("AppLogging").Clear

③我做的是bs开发,所以后端全部都是动态的内部函数,现在出现报错,不知道是什么函数出的错误

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

有没有什么好的方法,能显示触发报错的函数名就足够了,我就能定位函数去排查问题

[此贴子已经被作者于2020/4/13 12:34:12编辑过]

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


加好友 发短信
等级:六尾狐 帖子:1326 积分:9597 威望:0 精华:1 注册:2010/7/21 14:20:00
  发帖心情 Post By:2020/4/13 12:44:00 [只看该作者]

我也有这个需求,目前我是把函数执行建立日志,根据报错时间和函数执行时间来排查哪个函数有问题

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


加好友 发短信
等级:六尾狐 帖子:1276 积分:7927 威望:0 精华:4 注册:2017/12/31 14:53:00
回复:(浙江仔)我也有这个需求,目前我是把函数执行...  发帖心情 Post By:2020/4/13 12:54:00 [只看该作者]

我正准备像你这样做,但是回头一想,感觉这不是正路,应该根治一下

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


加好友 发短信
等级:六尾狐 帖子:1276 积分:7927 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2020/4/13 12:59:00 [只看该作者]

找了一下相关属性手册,好像没找到想要的

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


加好友 发短信
等级:超级版主 帖子:109728 积分:558356 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/13 13:43:00 [只看该作者]

这个需要foxtable内部处理。已反馈

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


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2020/4/17 15:45:00 [只看该作者]

BeforeShowErrorMessage
在Foxtable捕获错误并即将显示错误信息前执行。
e参数属性:
Event:   字符型,返回发生错误的事件名称或函数名称
Message1: 字符型,返回简明错误信息
Message2: 字符型,返回详细错误信息
Cancel:  逻辑型,设为True将禁止系统显示错误信息。
ex:       System.Exception类型,返回发生的错误,一般用户不需要使用此参数。
提示:
最好不要将Cancel参数设置为True,否则发生错误也不会提示,无法及时发现和纠正错误。

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


加好友 发短信
等级:六尾狐 帖子:1326 积分:9597 威望:0 精华:1 注册:2010/7/21 14:20:00
  发帖心情 Post By:2020/4/17 16:27:00 [只看该作者]

还真有这个功能,会提示自定义函数名称

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


加好友 发短信
等级:六尾狐 帖子:1276 积分:7927 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2020/5/3 12:56:00 [只看该作者]

总结改成这样,好用


①BeforeShowErrorMessage:

If User.Type <> UserTypeEnum.Developer  Then

    Functions.Execute("LogText",e)

    e.Cancel = True

End If


②内部函数:
'通过 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

③效果:

此主题相关图片如下:1.png
按此在新窗口浏览图片

[此贴子已经被作者于2020/5/4 22:35:06编辑过]

 回到顶部