Access 2010 vba error handling


Just a quick question regarding error handling in vba.

Should you implement error handling for each and every vba procedure? For example:

If opening a form to a specific record:
If Not Nz(Me.txtSubsIFAID, "") = "" Then
        Dim strLinkCriteria As String
        strLinkCriteria = "[SubsIFA_ID]=" & Me.txtSubsIFAID & " And [Prop_ID]=" & Me.txtPropID & ""
        DoCmd.OpenForm "frmAddSubsIFA", acNormal, , strLinkCriteria
    End If

DoCmd.OpenForm "frmPolicyPII_AddPolicyNote", acNormal, , acFormAdd

If Me.Dirty Then
        If MsgBox("You have made changes to the 'Client Data' and not saved them." & vbCrLf & vbCrLf & "Are you sure you wish to Exit without saving your changes?", vbYesNo + vbExclamation, "Client Details: Close Screen Alert") = vbYes Then
            DoCmd.Close acForm, "frmClientDetails"
            Exit Sub ' stay on form do nothing
        End If
        Forms![frmNavMenuForm].[NavMenuSubform].SourceObject = ""
    End If

Many thanks
Who is Participating?
Jack LeachConnect With a Mentor ProprietorCommented:
As a side note, you can probably get away without it for a small handful of procedures where you can be sure that no error would ever be raised.  Many do, but this begs the question: if I knew an error might be raised, I would have handled it in the code logic already, right?

Anything to do with the form's Dirty property or any DoCmd method, I don't really trust... in the examples you gave, I would definitely use an error handler, as they tend to be prone to non-obvious errors.

So again, once a person can recognize code that is error prone to code that isn't, they can make more informed decisions on when to use error handling and when it's "safe enough" to omit it.  It's probably a better practice to use a handler everywhere, otherwise.
Jack LeachProprietorCommented:
If a person has to ask, then yes, they should.  It's safer,and it's one of those "learn all the rules before you learn where to break them" type of things.

What is sure is that every code that runs absolutely should have an error handler somewhere in the call stack, thus preventing any unhandled errors from ever being raised.

If an error is raised and is not handled in the current procedure, it will look to the procedure that called it, and use the error handler there.  If there's none, it will go the procedure before that one, so on and so forth, until it finds a handler or runs to the bottom of the call stack.  Under no circumstances should it hit the bottom of the call stack without being handled.

Error propagation (as the above is called) can be a helpful tool when understood and used correctly.  As a general rule of thumb though, you're probably better off including basic error handling on every procedure unless you have some specific reason NOT to.

Tools like mz-tools can help greatly with that, in case you're not already aware (google the word, you'll find it).

DatabaseMX (Joe Anderson - Microsoft Access MVP)Database ArchitectCommented:
Hey Jack ... welcome to Experts Exchange ...

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.