Saya sedang membangun mesin yang menggunakan Jint untuk mengeksekusi file javascript dengan banyak fungsi.
Masalahnya adalah jika ada
semua yang Anda dapatkan dari Jint adalah JavaScriptException tanpa konteks di mana kesalahan terjadi.
Saat ini saya diturunkan untuk menambahkan pernyataan log hanya untuk menemukan masalah dalam skrip.
Akan sangat membantu jika setiap pelemparan Error() akan datang dengan properti stack yang diisi dengan stacktrace dari fungsi js.
Saya memiliki masalah yang sama, di mana beberapa skrip panjang akan sangat sulit untuk di-debug. Apa yang kami lakukan adalah membungkus Engine.Execute
di kita sendiri try
blok, dan re-lemparan dengan Engine.GetLastSyntaxNode().Location.Start
nilai. Contoh:
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);
}
Perhatikan bahwa akan jauh lebih baik jika objek location
adalah _selalu_ bagian dari objek JavaScriptException
.
Terima kasih, itu sangat membantu.
Saya masih berpikir akan sangat berharga untuk memiliki stacktrace yang tersedia. Alasannya adalah (dalam kasus saya) skrip dirakit secara dinamis, jadi beralih dari nomor baris ke baris aktual dalam skrip dinamis membutuhkan sedikit kerja ekstra.
Untuk beberapa kesalahan penguraian, saya juga menemukan pengecualian Esprima.ParserException
.
Dan saya merasa berguna untuk menambahkan juga teks baris yang menyebabkan kesalahan (seperti yang dicetak dalam pengecualian 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;
}
Komentar yang paling membantu
Saya memiliki masalah yang sama, di mana beberapa skrip panjang akan sangat sulit untuk di-debug. Apa yang kami lakukan adalah membungkus
Engine.Execute
di kita sendiritry
blok, dan re-lemparan denganEngine.GetLastSyntaxNode().Location.Start
nilai. Contoh: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); }
Perhatikan bahwa akan jauh lebih baik jika objek
location
adalah _selalu_ bagian dari objekJavaScriptException
.