2009-02-20 6 views
2

J'utilise JScript.NET pour écrire des scripts dans une application C# WinForms que j'ai écrite. Cela fonctionne très bien, mais j'ai juste essayé de mettre en place une gestion des exceptions dans un script, et je n'arrive pas à comprendre comment dire quel type d'exception a été lancé depuis mon code C#.Can JScript.NET distingue différents types d'exception .NET

Voici un exemple de code JScript qui lance deux types différents d'exception CLR, puis essaie de les attraper et de les différencier.

function ErrorTest(name) 
{ 
    try 
    { 
     if (name.length < 5) 
     { 
      throw new ArgumentException(); 
     }else 
     { 
      throw new InvalidOperationException(); 
     } 
    }catch (e) 
    { 
     return e.name + " " + (e.number & 0xFFFF) + ": " + e.message; 
    } 
} 

Si je l'appelle ErrorTest("foo"), puis je reviens "Error 5022: Value does not fall within the expected range.", et si je l'appelle ErrorTest("foobar"), puis je reviens "Error 5022: Operation is not valid due to the current state of the object."

Les propriétés nom et le numéro sont identiques, la seule différence est le message. Je ne veux pas commencer à écrire une logique de gestion des erreurs basée sur les messages d'erreur, donc existe-t-il un moyen d'obtenir l'exception originale au lieu de l'objet JScript Error?

Répondre

3

Utilisez le support d'annotation de type de JScript .NET, comme ceci:

try { } 
    catch (e : ArgumentException) { 
    // ... 
    } 
+0

Doux! Où étais-tu il y a quatre mois? Je suppose que j'aurais dû continuer à chercher dans la documentation de JScript. –

+0

Je pensais la même chose! Où comme il y a quatre mois!? En effet, j'ai lu à peu près tous les docs de JScript et ai été le meilleur pour cela. –

-1

Vous devriez être en mesure de le faire:

function ErrorTest(name) 
{ 
    try 
    { 
     if (name.length < 5) 
     { 
      throw new ArgumentException(); 
     }else 
     { 
      throw new InvalidOperationException(); 
     } 
    } 
    catch (ArgumentException e) 
    { 
     return "Argument Exception: " + e.message; 
    } 
    catch (InvalidOperationException e) 
    { 
     return "Operation Exception: " + e.message; 
    } 
    catch (e) 
    { 
     return "Unknown Exception: " + e.message; 
    } 
} 

et faire la gestion des erreurs pour chaque exception tapez cette façon.

+0

Merci, mais l'échantillon est le code JScript, de sorte que l'instruction catch ne permet pas un type d'exception. Tout ce que je semble être autorisé est un nom de variable. –

+0

Bon point. Vous pouvez lancer une nouvelle erreur (nombre, "MessageString") et tester le nombre de cette façon. Je pense que vous pourriez ne pas avoir de chance d'essayer de manipuler les exceptions CLR de JScript. –

0

Vous pouvez obtenir l'exception d'origine en utilisant le ErrorObject.ToException method, puis utiliser instanceof pour décider comment le gérer.

Cela fonctionne, mais je n'ai pas encore décidé de l'utiliser. Je pense qu'il abuse du cadre, car la documentation dit:

Cette API prend en charge l'infrastructure .NET Framework et n'est pas destinée à être utilisée directement à partir de votre code.

De plus, vous devrez ajouter une référence à l'assembly Microsoft.JScript et importer l'espace de noms Microsoft.JScript.

Voici le nouveau code:

function ErrorTest(name) 
{ 
    try 
    { 
     if (name.length < 5) 
     { 
      throw new ArgumentException(); 
     }else 
     { 
      throw new InvalidOperationException(); 
     } 
    }catch (e) 
    { 
     var ex = ErrorObject.ToException(e); 
     if (ex instanceof ArgumentException) 
     { 
      return "bad argument"; 
     } 
     return "something bad"; 
    } 
} 
+0

Je pars ici pour référence, mais la réponse acceptée est évidemment bien meilleure. –

Questions connexes