我目前正在维护一些代码,很快就会被重构。在此之前,我想制作标准的错误处理代码,该代码由外接程序注入,效率更高,占用的空间更少。令我烦恼的一件事是每个模块都有一个名为m_ksModuleName
的常量,用于构造一个大字符串,然后从错误处理程序中重新抛出,这样我们就可以跟踪错误堆栈。这是所有模板代码,即重复,但我可以轻松地将其删除到过程调用。现在,我修复了代码,以便您可以将Me引用传递给过程 - 但是您不能为BAS模块执行此操作。您也无法访问项目名称(例如,作为ProgramID的一部分传递的部分) - 尽管您自己提出错误时会得到它。
所有这些字符串都包含在EXE,DLL或OCX中 - 相信我,我使用调试器来查找它们。但是如何在代码中访问这些?
答案 0 :(得分:1)
我不确定以编程方式获取您所在模块的名称的简单方法。通常的解决方案是在每个方法的顶部将变量设置为模块的名称,然后它是可用于错误处理程序以用于日志记录:
'In MyModule.bas'
Public Sub Foo()
Const MODULE_NAME As String = "MyModule"
On Error GoTo ErrorHandler
' Code here '
Exit Sub
ErrorHandler:
LogError Err.Number, Err.Description, MODULE_NAME
End Sub
如果您使用的是MZTools等加载项,您可以为它生成此样板代码。
至于获取当前组件名称,您可以使用App.EXEName
访问它(尽管名称,这适用于其他项目类型,如DLL)。在IDE中运行时,从项目属性(项目 - >属性)中的项目名称字段中提取此值,并在运行时从已编译二进制文件的名称(减去文件扩展名)中提取该值在IDE之外。
答案 1 :(得分:1)
AFAIK无法在代码中获取BAS模块的名称。通常的解决方案是使用Mike's answer中的模块级常量。
AFAIK获取ProgID(项目属性对话框中的程序ID,项目名称)的唯一方法是在BAS模块中引发错误,捕获它并读取Err.Source
。
这一切都很麻烦,这就是为什么我们通常不会在标准错误处理程序中包含模块名称或ProgID。我们使用例程的名称“滚动我们自己的”调用堆栈。这总是足以找出涉及哪些模块的信息。 BAS模块中的例程通常具有唯一的名称,对吗?
类似this之类的内容,您可以使用免费的MZTools VB6加载项自动添加此内容。
Sub / Function whatever
On Error Goto Handler
do some stuff
Exit Sub / Function
Handler:
Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description
End Sub
DLL或OCX中的每个顶级例程都有一个类似的错误处理程序,但也包含App.ExeName
,因此我们可以判断错误何时跨越组件边界。