Jint: s'il vous plaît ajouter la possibilité d'obtenir une trace des erreurs et des exceptions

Créé le 12 nov. 2014  ·  3Commentaires  ·  Source: sebastienros/jint

Je construis un moteur qui utilise Jint pour exécuter un fichier javascript avec un tas de fonctions.

Le problème est que s'il y a

  • une erreur de syntaxe
  • une erreur d'exécution
  • une nouvelle erreur ()

tout ce que vous obtenez de Jint est une exception JavaScript sans contexte quant à l'endroit où l'erreur s'est produite.

À l'heure actuelle, je suis relégué à ajouter des instructions de journal juste pour trouver le problème dans le script.

Il serait extrêmement utile que tout lancement d'Error () vienne avec la propriété stack remplie avec la trace de pile des fonctions js.

Commentaire le plus utile

J'ai eu le même problème, où certains longs scripts seraient extrêmement difficiles à déboguer. Ce que nous avons fait, c'est envelopper Engine.Execute dans notre propre bloc try et le relancer avec les valeurs Engine.GetLastSyntaxNode().Location.Start . Exemple:

c# var engine = new Engine(); try { engine.Execute("some code that throws..."); } catch(JavaScriptException exc) { var location = engine.GetLastSyntaxNode().Location.Start; throw new ApplicationException( String.Format("{0} (Line {1}, Column {2})", exc.Error, location.Line, location.Column ), exc); }

Notez que ce serait bien mieux si l'objet location faisait _toujours_ partie de l'objet JavaScriptException .

Tous les 3 commentaires

J'ai eu le même problème, où certains longs scripts seraient extrêmement difficiles à déboguer. Ce que nous avons fait, c'est envelopper Engine.Execute dans notre propre bloc try et le relancer avec les valeurs Engine.GetLastSyntaxNode().Location.Start . Exemple:

c# var engine = new Engine(); try { engine.Execute("some code that throws..."); } catch(JavaScriptException exc) { var location = engine.GetLastSyntaxNode().Location.Start; throw new ApplicationException( String.Format("{0} (Line {1}, Column {2})", exc.Error, location.Line, location.Column ), exc); }

Notez que ce serait bien mieux si l'objet location faisait _toujours_ partie de l'objet JavaScriptException .

Merci, c'est très utile.

Je pense toujours qu'il serait très utile d'avoir un stacktrace disponible. La raison en est que (dans mon cas) le script est assemblé dynamiquement, donc passer d'un numéro de ligne à la ligne réelle dans le script dynamique demande un peu de travail supplémentaire.

Pour certaines erreurs d'analyse, j'ai également rencontré l'exception Esprima.ParserException .
Et j'ai trouvé utile d'ajouter également le texte de la ligne provoquant l'erreur (tel qu'imprimé dans l'exception ClearScript)

public void Run(string script)
{
    JintEngine.Execute(script);

    catch (Esprima.ParserException ex)
    {
        throw new ApplicationException($"{ex.Error} (Line {ex.LineNumber}, Column {ex.Column}), -> {ReadLine(script, ex.LineNumber)})", ex);
    }
    catch (Jint.Runtime.JavaScriptException ex) 
    {
        throw new ApplicationException($"{ex.Error} (Line {ex.LineNumber}, Column {ex.Column}), -> {ReadLine(script, ex.LineNumber)})", ex);
    }
}

private static string ReadLine(string text, int lineNumber)
{
    using var reader = new System.IO.StringReader(text);

    string line;
    int currentLineNumber = 0;

    do
    {
        currentLineNumber += 1;
        line = reader.ReadLine();
    }
    while (line != null && currentLineNumber < lineNumber);

    return (currentLineNumber == lineNumber) ? line : string.Empty;
}
Cette page vous a été utile?
0 / 5 - 0 notes