рдореИрдВ рдПрдХ рдЗрдВрдЬрди рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ
рдЖрдк рд╕рднреА рдЬрд┐рдВрдЯ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрд╡рд╛рдж рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдВ рд╣реБрдИред
рдЕрднреА рдореБрдЭреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░реЛрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдмреЗрд╣рдж рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдПрд░рд░ () рдХреЛ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдЬреЗрдПрд╕ рдлрдВрдХреНрд╢рди рдХреЗ рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рд╕реЗ рднрд░реА рд╣реБрдИ рд╕реНрдЯреИрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдЖрддреА рд╣реИред
рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдЬрд╣рд╛рдВ рдХреБрдЫ рд▓рдВрдмреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ 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;
}
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдЬрд╣рд╛рдВ рдХреБрдЫ рд▓рдВрдмреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣
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
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛред