์ ๋ Jint๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ ๊ธฐ๋ฅ์ด ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํํ๋ ์์ง์ ๋ง๋ค๊ณ ์์ต๋๋ค.
๋ฌธ์ ๋ ์๋ค๋ฉด
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
๊ฐ์ฒด์ _ํญ์_ ๋ถ๋ถ์ด๋ฉด ํจ์ฌ ๋ ์ข์ ๊ฒ์
๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์คํ ์ถ์ ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์ฌ์ ํ โโ๋งค์ฐ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ์ด์ ๋ (์ ๊ฒฝ์ฐ) ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์ผ๋ก ์กฐํฉ๋์ด ๋์ ์คํฌ๋ฆฝํธ์ ์ค ๋ฒํธ์์ ์ค์ ์ค๋ก ์ด๋ํ๋ ๋ฐ ์ฝ๊ฐ์ ์ถ๊ฐ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ผ๋ถ ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ์ ๊ฒฝ์ฐ 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;
}
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ผ๋ถ ๊ธด ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ฒ๊ทธํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ด ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ๊ฒ์
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
๊ฐ์ฒด์ _ํญ์_ ๋ถ๋ถ์ด๋ฉด ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค.