Access 2016 VBA运行时错误-如何捕获?

Access 2016 VBA运行时错误-如何捕获?,vba,ms-access,error-handling,ms-access-2016,Vba,Ms Access,Error Handling,Ms Access 2016,提前道歉-这可能是一个很长的-所有代码都添加在底部 我正在开发一个数据库,用于跟踪支持票证。 我一直在试图清除跟踪器中出现的错误,所以我开始重建——清理代码——更改字段名等等——这是一个全新的数据库,没有人可以访问。但由于某种原因,我的错误代码似乎不再被捕获。所以让我解释一切 前端打开,打开时加载登录表单-这利用DLOOKUP检查并匹配密码-这很好 登录后,票证输入表单加载(Frm_票证输入),这有多个数据字段和2个按钮。(我只列出几个,因为实际上没有一个是强制性的) 字段名称: Tic

提前道歉-这可能是一个很长的-所有代码都添加在底部

我正在开发一个数据库,用于跟踪支持票证。 我一直在试图清除跟踪器中出现的错误,所以我开始重建——清理代码——更改字段名等等——这是一个全新的数据库,没有人可以访问。但由于某种原因,我的错误代码似乎不再被捕获。所以让我解释一切

前端打开,打开时加载登录表单-这利用DLOOKUP检查并匹配密码-这很好 登录后,票证输入表单加载(Frm_票证输入),这有多个数据字段和2个按钮。(我只列出几个,因为实际上没有一个是强制性的)

字段名称:

    Ticket_Number - (fairly self explanatory)
    Agent         - (Agent working ticket)
    Return_Team   - (if ticket was returned)
按钮:

    New Record - (Adds a new record - Guess you can tell that)
    Save Record - (saves record after data changes)
使用Err.raise(“错误号”)时-我的捕手按预期工作

当我关闭err.raise(注释掉)并运行所有内容时-我有时会在以前的DB版本中点击“运行时错误”(例如锁定编辑)-这被我的错误捕捉器捕捉到-并生成自定义输出-现在,它似乎不想捕捉运行时错误-为什么不,出了什么问题!? (抱歉阅读太多-我很难准确但简短地描述事情。-如有需要,可提供更多信息)

“新记录”代码:

错误记录器的名称和代码:

    Function ErrorLogger(ErrNum As Integer, ErrDesc, ErrSrc As String)

Select Case ErrNum

Case 3314 ' You must enter a value in the 'tblKickbacks.Ticket Number' field.
MsgBox "It seems some required fields may not have been completed! " _
& "Please ensure you have filled in 'Ticket Number' / 'Agent' /     'Returning Team' and/or 'Kickback Reason'"

If IsNull(Me.Ticket_Number) Then
Me.Ticket_Number.SetFocus
End If

If (MsgBox("Error " & ErrNum & " occured." & vbNewLine _
& "Details : " & ErrDesc & vbNewLine _
& "Error occured in : " & ErrSrc & vbNewLine _
& "Would you like to send an email error report?" _
, 4 Or 16, "ERROR DETECTED")) = vbYes _
Then
    GoTo DevEmail
Else
    GoTo Err_Exit
End If

Case 2105 ' You can't go to the specified record.

MsgBox "Error Caught - 2105"

Case 3218 ' Error Description: Could not update; currently locked.

'   Need to find and add code here for forcibly unlocking any and ALL locked records

Case Else
MsgBox "Error : " & ErrNum & " -- " & ErrDesc & " " _
& "Not recognised - Sending error email"
GoTo DevEmail

End Select

DevEmail:

Dim oAPP As Outlook.Application
Dim oMail As Outlook.MailItem

' Create the Outlook session.
Set oAPP = New Outlook.Application

' Create the message.
Set oMail = oAPP.CreateItem(olMailItem)

With oMail
    ' Add the To recipient(s) to the message.
    .To = "mwalker53@csc.com"
    .Subject = "Tracker V2 Error"
    .Body = "Error message as Follows:" & vbNewLine _
                    & "Error Number: " & ErrNum & vbNewLine _
                    & "Error Description: " & ErrDesc & vbNewLine _
                    & "Error Source: " & ErrSrc
    .Send
End With
MsgBox "Email has been sent"

Err_Exit:        
End Function

将错误上的
移动到第一行的错误句柄

Private Sub btn_NewRecord_Click()
    On Error GoTo Error_Handle    

    ...

End Sub

将错误上的
移动到第一行的错误句柄

Private Sub btn_NewRecord_Click()
    On Error GoTo Error_Handle    

    ...

End Sub

on error goto errhandle和exit sub之间没有任何区别您需要添加新记录的代码上方的那一行

on error goto errhandle和exit sub之间没有任何区别您需要添加新记录的代码上方的那一行

我无法创建冲突并测试这一点-但如果这都是错误的,那该死。我不知道我怎么会如此愚蠢,o。o。它在逻辑上有着完美的意义——但出于某种原因,我认为On Error GoTo是对任何错误的一个通用的全面覆盖——不管它在代码中的位置如何。我真不敢相信我竟然把这么简单的事情看得过火了!我将保持此打开状态-直到我可以确认错误捕获是否正常工作?我计划今天晚些时候对数据库进行一次大规模测试,所以希望一切都会好起来:)我一直在测试这个数据库,在某种程度上一切都很好。测试中有3人收到“运行时错误6-溢出”-我的错误捕获代码无法捕获此错误并按我的代码报告。这很奇怪,因为还发现了其他错误(Err.2105/Err.3218)。奇怪的是另一个正在测试的用户,正在使用相同的FE文件副本-并记录到相同的BE文件-并且没有收到任何错误:/-这开始让我感到困惑-如果没有捕获到来自不同代码的错误,将非常感谢任何进一步的帮助。将错误处理程序放入完整的代码中。在玩过它之后-我意识到这个错误是因为我分配给存储错误号的变量仅被设置为int-错误代码太大导致溢出错误-所以重新设置为long并解决了。我无法创建冲突并测试它-但是如果这就是全部那就错了,该死。我不知道我怎么会如此愚蠢,o。o。它在逻辑上有着完美的意义——但出于某种原因,我认为On Error GoTo是对任何错误的一个通用的全面覆盖——不管它在代码中的位置如何。我真不敢相信我竟然把这么简单的事情看得过火了!我将保持此打开状态-直到我可以确认错误捕获是否正常工作?我计划今天晚些时候对数据库进行一次大规模测试,所以希望一切都会好起来:)我一直在测试这个数据库,在某种程度上一切都很好。测试中有3人收到“运行时错误6-溢出”-我的错误捕获代码无法捕获此错误并按我的代码报告。这很奇怪,因为还发现了其他错误(Err.2105/Err.3218)。奇怪的是另一个正在测试的用户,正在使用相同的FE文件副本-并记录到相同的BE文件-并且没有收到任何错误:/-这开始让我感到困惑-如果没有捕获到来自不同代码的错误,将非常感谢任何进一步的帮助。将错误处理程序放入完整的代码中。在玩过它之后-我意识到这个错误是因为我分配用于存储错误号的变量仅被设置为int-错误代码太大导致溢出错误-因此重新设置为long并解决。