gpt4 book ai didi

ms-access - 获取当前 VBA 函数的名称

转载 作者:行者123 更新时间:2023-12-02 19:44:10 27 4
gpt4 key购买 nike

对于错误处理代码,我想获取发生错误的当前 VBA 函数(或子函数)的名称。有谁知道如何做到这一点?

[编辑]谢谢大家,我曾希望存在一个未记录的技巧来自行确定函数,但这显然不存在。我想我会保留当前的代码:

Option Compare Database: Option Explicit: Const cMODULE$ = "basMisc"

Public Function gfMisc_SomeFunction$(target$)
On Error GoTo err_handler: Const cPROC$ = "gfMisc_SomeFunction"
...
exit_handler:
....
Exit Function
err_handler:
Call gfLog_Error(cMODULE, cPROC, err, err.Description)
Resume exit_handler
End Function

最佳答案

没有任何方法可以获取当前函数名称,但您可以利用 VBA 对象生命周期是确定性的这一事实构建一个相当轻量级的跟踪系统。例如,您可以使用以下代码创建一个名为“Tracer”的类:

Private proc_ As String

Public Sub init(proc As String)
proc_ = proc
End Sub

Private Sub Class_Terminate()
If Err.Number <> 0 Then
Debug.Print "unhandled error in " & proc_
End If
End Sub

然后在例程中使用该类,例如:

Public Sub sub1()
Dim t As Tracer: Set t = New Tracer
Call t.init("sub1")

On Error GoTo EH

Call sub2

Exit Sub

EH:
Debug.Print "handled error"
Call Err.Clear
End Sub

Public Sub sub2()
Dim t As Tracer: Set t = New Tracer
Call t.init("sub2")

Call Err.Raise(4242)
End Sub

如果运行“sub1”,您应该得到以下输出:

unhandled error in sub2
handled error

因为当错误导致例程退出时,“sub2”中的 Tracer 实例被确定性地销毁。

这种通用模式在 C++ 中经常出现,名称为“RAII”,但它在 VBA 中也能正常工作(除了使用类的普遍烦恼之外)。

编辑:

针对 David Fenton 的评论,即这是一个简单问题的相对复杂的解决方案,我认为问题实际上并不那么简单!

我想当然地认为我们都同意我们不想为 VBA 程序中的每个例程提供自己的错误处理程序。 (请参阅我的推理:VBA Error "Bubble Up")

如果某些内部例程没有自己的错误处理程序,那么当我们确实捕获错误时,我们所知道的只是发生在具有触发的错误处理程序的例程中或在调用堆栈中更深处的例程。因此,据我了解,问题实际上是跟踪我们程序的执行情况之一。当然,跟踪日常条目很容易。但追踪退出确实可能相当复杂。例如,可能会引发错误!

RAII 方法允许我们使用 VBA 对象生命管理的自然行为来识别何时退出例程,无论是通过“退出”、“结束”还是错误。我的玩具示例只是为了说明这个概念。我自己的小VBA框架中真正的“跟踪器”当然更复杂,但也做更多的事情:

Private Sub Class_Terminate()
If unhandledErr_() Then
Call debugTraceException(callID_, "Err unhandled on exit: " & fmtCurrentErr())
End If

If sendEntryExit_ Then
Select Case exitTraceStatus_
Case EXIT_UNTRACED
Call debugTraceExitImplicit(callID_)
Case EXIT_NO_RETVAL
Call debugTraceExitExplicit(callID_)
Case EXIT_WITH_RETVAL
Call debugTraceExitExplicit(callID_, retval_)
Case Else
Call debugBadAssumption(callID_, "unrecognized exit trace status")
End Select
End If
End Sub

但是使用它仍然非常简单,并且比“每个例程中的 EH”方法更少的样板代码:

Public Function apply(functID As String, seqOfArgs)
Const PROC As String = "apply"
Dim dbg As FW_Dbg: Set dbg = mkDbg(MODL_, PROC, functID, seqOfArgs)

...

自动生成样板文件很容易,尽管我实际上将其输入然后自动检查以确保例程/参数名称匹配作为我的测试的一部分。

关于ms-access - 获取当前 VBA 函数的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3792134/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com