Question Récupération du code d'erreur spécifique à COMException


J'espère que quelqu'un peut m'aider. J'ai une exception spécifique de COM que je dois attraper et ensuite essayer de faire autre chose, tous les autres devraient être ignorés. Mon message d'erreur avec l'exception est le suivant:

System.Runtime.InteropServices.COMException   (0x800A03EC): Microsoft Office Excel   ne peut pas accéder au fichier 'C: \ test.xls'.   Il y a plusieurs raisons possibles:

Donc, ma première tentative était

try
{
 // something
}
catch (COMException ce)
{
   if (ce.ErrorCode == 0x800A03EC)
   {
      // try something else 
   }
}

Cependant, je lis un avertissement du compilateur:

Attention 22 Comparaison à l'intégrale   la constante est inutile; la constante est   en dehors de la gamme de type   'int' ..... ExcelReader.cs 629 21

Maintenant, je sais que le 0x800A03EC est le HResult et moi venons de regarder sur MSDN et lis:

HRESULT est une valeur de 32 bits,   divisé en trois domaines différents: a   code de gravité, un code d'installation et un   code d'erreur. Le code de gravité   indique si la valeur de retour   représente une information, un avertissement ou   Erreur. Le code d'installation identifie   la zone du système responsable de   l'erreur.

Donc, ma question ultime est la suivante: comment s’assurer que je piège cette exception spécifique? Ou comment puis-je obtenir le code d'erreur du HResult?

Merci d'avance.


24
2017-09-15 09:32


origine


Réponses:


Le code d'erreur doit être un entier non signé; vous pouvez effectuer la comparaison comme suit:

try {
    // something
} catch (COMException ce) {
    if ((uint)ce.ErrorCode == 0x800A03EC) {
        // try something else 
    }
}

36
2017-09-15 09:45



Une valeur HRESULT a 32 bits répartis en trois champs: un code de gravité, un code de fonctionnalité et un code d'erreur. Le code de gravité indique si la valeur de retour représente des informations, des avertissements ou des erreurs. le code d'établissement identifie la zone du système responsable de l'erreur. le code d'erreur est un numéro unique attribué pour représenter l'exception. Chaque exception est associée à un HRESULT distinct. Extrait: http://en.wikipedia.org/wiki/HRESULT

D'après ce que j'ai compris, la première moitié des bits HRESULT peut changer en fonction du système / processus à l'origine de l'exception. La seconde moitié contient le type d'erreur.

Le code devrait ressembler à:

try {
    // something
} catch (COMException ce) {
    if ((uint)ce.ErrorCode & 0x0000FFFF == 0x800A03EC) {
        // try something else 
    }
}

NOTE: s'il vous plaît gardez à l'esprit que je ne suis pas un gars .NET, donc soyez fatigué des erreurs de syntaxe dans le code ci-dessus.


10
2017-07-16 15:07



J'ai effectivement réussi à le faire fonctionner sur le système dont j'avais besoin et j'ai trouvé que le code d'erreur était -2146807284.

En regardant cela, si je convertis le 0x800A03EC en binaire, puis le traiter comme un complément à 2, alors vous pouvez calculer la valeur.


0
2017-09-15 09:48