Jint: ์˜ค๋ฅ˜ ๋ฐ ์˜ˆ์™ธ์—์„œ ์Šคํƒ ์ถ”์ ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

์— ๋งŒ๋“  2014๋…„ 11์›” 12์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sebastienros/jint

์ €๋Š” Jint๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ์—”์ง„์„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์žˆ๋‹ค๋ฉด

  • ๊ตฌ๋ฌธ ์˜ค๋ฅ˜
  • ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜
  • ์ƒˆ๋กœ์šด Error() ๋˜์ง€๊ธฐ

Jint์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์œ„์น˜์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†๋Š” JavaScriptException๋ฟ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ๋งŒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.

js ํ•จ์ˆ˜์˜ ์Šคํƒ ์ถ”์ ์œผ๋กœ ์ฑ„์›Œ์ง„ ์Šคํƒ ์†์„ฑ๊ณผ ํ•จ๊ป˜ Error()๋ฅผ ๋˜์ง€๋ฉด ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ผ๋ถ€ ๊ธด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šด ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•œ ๊ฒƒ์€ 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 ๋“ฑ๊ธ‰