<p>Vous avez une réponse vraiment formidable de ray023, mais votre commentaire disant que c’est probablement excessif est pertinent. Pour une version “plus légère”…</p>
<p><strong>Bloc 1</strong> est, à mon humble avis, une mauvaise pratique. Comme l’a déjà souligné osknows, mélanger la gestion des erreurs avec le code du chemin normal n’est pas bien. Entre autres choses, si une <em>nouvelle</em> erreur est levée pendant qu’il y a une condition d’erreur active, vous n’aurez <strong>pas</strong> l’occasion de la gérer (sauf si vous appelez depuis une routine qui a aussi un gestionnaire d’erreurs, où l’exécution va “remonter”).</p>
<p><strong>Bloc 2</strong> ressemble à une imitation d’un bloc Try/Catch. Cela devrait être correct, mais ce n’est pas la manière VBA. <strong>Bloc 3</strong> est une variation du Bloc 2.</p>
<p><strong>Bloc 4</strong> est une version minimale de la manière VBA. Je vous <em>conseillerais fortement</em> de l’utiliser, ou quelque chose de similaire, car c’est ce que tout autre programmeur VBA héritant du code s’attendra à trouver. Permettez-moi de présenter une petite extension, cependant :</p>
<pre><code class="lang-auto">Private Sub DoSomething()
On Error GoTo ErrHandler
'Dim as required
'functional code that might throw errors
ExitSub:
'any always-execute (cleanup?) code goes here -- analagous to a Finally block.
'don't forget to do this -- you don't want to fall into error handling when there's no error
Exit Sub
ErrHandler:
'can Select Case on Err.Number if there are any you want to handle specially
'display to user
MsgBox "Something's wrong: " & vbCrLf & Err.Description
'or use a central DisplayErr routine, written Public in a Module
DisplayErr Err.Number, Err.Description
Resume ExitSub
Resume
End Sub
</code></pre>
<p>Notez ce second <code>Resume</code>. C’est une astuce que j’ai apprise récemment : il ne s’exécutera <em>jamais</em> dans le traitement normal, puisque l’instruction <code>Resume <label></code> enverra l’exécution ailleurs. Cela peut être une bénédiction pour le débogage, cependant. Lorsque vous recevez une notification d’erreur, choisissez Déboguer (ou appuyez sur Ctrl-Break, puis choisissez Déboguer lorsque vous recevez le message “L’exécution a été interrompue”). L’instruction suivante (surlignée) sera soit le <code>MsgBox</code> soit l’instruction suivante. Utilisez “Définir l’instruction suivante” (Ctrl-F9) pour surligner le <code>Resume</code> seul, puis appuyez sur F8. Cela vous montrera <em>exactement</em> où l’erreur a été levée.</p>
<p>Quant à votre objection sur ce format qui “saute partout”, A) c’est ce que les programmeurs VBA s’attendent à trouver, comme indiqué précédemment, et B) vos routines <em>devraient</em> être suffisamment courtes pour que le saut ne soit pas long.</p>