Вы должны сделать это трудным путем, но это не совсем все , что трудно ... Серьезно, если вы написали шаблон один раз, это быстрая копия / paste / modify для сопоставления имени функции в операторе Err.Raise с фактическим именем функции.
Private Function DoSomething(ByVal Arg as String)
On Error GoTo Handler
Dim ThisVar as String
Dim ThatVar as Long
' Code here to implement DoSomething...
Exit Function
Handler:
Err.Raise Err.Number, , "MiscFunctions.DoSomething: " & Err.Description
End Function
Когда у вас есть вложенные вызовы, это раскручивается, когда каждая подпрограмма достигает своего обработчика и добавляет свое имя в описание ошибки. В функции верхнего уровня вы получаете «стек вызовов», показывающий список вызванных подпрограмм, номер ошибки и описание фактически возникшей ошибки. Это не идеально, потому что вы не получаете номера строк, но я обнаружил, что вам обычно не нужны они, чтобы найти путь к проблеме. (И если вам действительно нужны номера строк, вы можете поместить их в функцию и ссылаться на них в операторе Err.Raise, используя переменную Erl. Без номеров строк это просто возвращает 0.)
Также обратите внимание, что внутри самой функции вы можете выдавать свои собственные ошибки со значениями интересных переменных в сообщении, например, так:
Err.Raise PCLOADLETTER_ERRNUM, , "PC Load Letter error on Printer """ & PrinterName & """"
(Подсветка синтаксиса выглядит превью в превью ... Интересно, как она будет выглядеть при публикации?)