Jint: поТалуйста, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния трассировки стСка ΠΈΠ· ошибок ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 12 нояб. 2014  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: sebastienros/jint

Π― создаю Π΄Π²ΠΈΠΆΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Jint для выполнСния Ρ„Π°ΠΉΠ»Π° javascript с мноТСством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π΅ΡΡ‚ΡŒ

  • синтаксичСская ошибка
  • ошибка Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния
  • Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ ()

всС, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΎΡ‚ Jint, - это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ JavaScriptException Π±Π΅Π· контСкста, Π³Π΄Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка.

ΠŸΡ€ΡΠΌΠΎ сСйчас я Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΆΡƒΡ€Π½Π°Π»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² сцСнарии.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Π±Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Error () свойство стСка Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ трассировкой стСка js-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π£ мСня Π±Ρ‹Π»Π° Ρ‚Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ скрипты Π±Ρ‹Π»ΠΎ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ слоТно ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ. Π§Ρ‚ΠΎ ΠΌΡ‹ сдСлали, Ρ‚Π°ΠΊ это ΠΎΠ±Π΅Ρ€Π½ΡƒΠ»ΠΈ Engine.Execute Π² наш собствСнный Π±Π»ΠΎΠΊ try ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ выбросили со значСниями Engine.GetLastSyntaxNode().Location.Start . ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

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); }

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ location Π±Ρ‹Π» _всСгда_ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° JavaScriptException .

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π£ мСня Π±Ρ‹Π»Π° Ρ‚Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ скрипты Π±Ρ‹Π»ΠΎ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ слоТно ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ. Π§Ρ‚ΠΎ ΠΌΡ‹ сдСлали, Ρ‚Π°ΠΊ это ΠΎΠ±Π΅Ρ€Π½ΡƒΠ»ΠΈ Engine.Execute Π² наш собствСнный Π±Π»ΠΎΠΊ try ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ выбросили со значСниями Engine.GetLastSyntaxNode().Location.Start . ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

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); }

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, Ссли Π±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ location Π±Ρ‹Π» _всСгда_ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° JavaScriptException .

Бпасибо, это ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ.

Π― всС Π΅Ρ‰Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ трассировку стСка. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ (Π² ΠΌΠΎΠ΅ΠΌ случаС) сцСнарий динамичСски собираСтся, поэтому ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π° строки ΠΊ фактичСской строкС Π² динамичСском сцСнарии Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ нСбольшой Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ошибок синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Esprima.ParserException .
И я счСл ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ тСкст строки, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΎΡˆΠΈΠ±ΠΊΡƒ (ΠΊΠ°ΠΊ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½ΠΎ Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ 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;
}
Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ