Perché c'è Err.Number multiple per lo stesso Err.Description?
-
25-09-2019 - |
Domanda
Leggendo varie proprietà dei risultati della raccolta Outlook.MAPIFolder.Items in un errore quando le autorizzazioni degli utenti non sono sufficienti, ad esempio, se la cartella è visibile ma non sfogliabile.
La descrizione di errore è: Non c'è bisogno di autorizzazioni sufficienti per eseguire questa operazione su questo oggetto. Vedere il contatto di cartella o l'amministratore di sistema.
Volevo trappola che l'errore in questo modo (in Outlook 2003):
Sub MySub(StartFolder As Outlook.MAPIFolder)
...
On Error GoTo ErrHandler
If (StartFolder.Items.Count = 0) Then Exit Sub 'this really is a permission test'
On Error GoTo 0
...
ErrHandler:
If ((Err.Number <> 0) And (Err.Number <> -2114519035)) Then
Call MsgBox("Error " & Err.Number & ": " & Err.Description, vbExclamation + vbOKOnly, StartFolder.Name, _
Err.HelpFile, Err.HelpContext)
...
End Sub
Test mio gestore degli errori, ho trovato un altro numero di errore con la stessa descrizione ... e l'elenco è cresciuto rapidamente a 62 errori con la stessa descrizione! Err.Number varia da -2.114,519035 millions a -1.638.395. Tutti i numeri di errore sembrano FFxxx70005 in esadecimale.
Perché c'è Err.Number multiple per lo stesso Err.Description? Come ti intercettare questi errori, e solo loro, facilmente? È l'errore esadecimale struttura di numero caratteristico di questo errore?
Oh, e non mi piace l'idea di testare la descrizione (troppo locale- e versione specifica).
Soluzione
Questo numero errore sembra un HRESULT
-. Consultare la pagina per HRESULT
su Wikipedia
Il pezzo che è diversa per te, che hai contrassegnato come xxx
, è lo "Strumento", o in altre parole, che parte di Windows sta tornando l'errore.
L'errore effettivo è nelle 16 bit di fondo, o 0x00005
nel tuo caso, che significa "accesso negato". I valori che vedi sono tutti i diversi modi in cui Windows può dire "Accesso negato", per esempio. "Accesso negato a un file", "Accesso negato al negozio certificato", "Accesso negato a un servizio di rete", ecc.
Prendere i 16 bit inferiori del errore e confronta con 5
per intercettare tutti i casi in cui "i permessi dell'utente sono insufficienti".
Altri suggerimenti
Credo che questo sia perché l'operazione richiesta è composto, cioè, richiede più chiamate alle varie interfacce COM, ognuno dei quali può restituire un HRESULT diverso descrive un errore che si è verificato in quel piccolo passo. Il metodo cerca racchiudono per generare un messaggio più user-friendly, quindi in caso di qualsiasi errore dà la stessa stringa di errore (che di solito è una buona cosa da fare, usabilità-saggio). Allo stesso tempo, il codice di errore COM originale è conservato nel caso qualcuno si sarebbe preso cura.
Credo che in questo caso il meglio che puoi fare è fare lo stesso, vale a dire, dando la stessa stringa user-friendly per tutti i codici di errore.
Se si vuole realmente analizzare i codici di errore, si desidera Struttura dei codici di errore COM .