Jint: рдХреГрдкрдпрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдирд╡ре░ 2014  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sebastienros/jint

рдореИрдВ рдПрдХ рдЗрдВрдЬрди рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ

  • рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐
  • рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐
  • рдПрдХ рдлреЗрдВрдХ рдирдИ рддреНрд░реБрдЯрд┐ ()

рдЖрдк рд╕рднреА рдЬрд┐рдВрдЯ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрд╡рд╛рдж рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╣реБрдИред

рдЕрднреА рдореБрдЭреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░реЛрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдмреЗрд╣рдж рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдПрд░рд░ () рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдЬреЗрдПрд╕ рдлрдВрдХреНрд╢рди рдХреЗ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рд╕реЗ рднрд░реА рд╣реБрдИ рд╕реНрдЯреИрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдЖрддреА рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдЬрд╣рд╛рдВ рдХреБрдЫ рд▓рдВрдмреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ 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 рдСрдмреНрдЬреЗрдХреНрдЯ _always_ 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 рдСрдмреНрдЬреЗрдХреНрдЯ _always_ 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕