Jint: tolong tambahkan kemampuan untuk mendapatkan stacktrace dari kesalahan dan pengecualian

Dibuat pada 12 Nov 2014  ·  3Komentar  ·  Sumber: sebastienros/jint

Saya sedang membangun mesin yang menggunakan Jint untuk mengeksekusi file javascript dengan banyak fungsi.

Masalahnya adalah jika ada

  • kesalahan sintaks
  • kesalahan waktu proses
  • sebuah lemparan Kesalahan baru ()

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.

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 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 .

Semua 3 komentar

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;
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

christianscheuer picture christianscheuer  ·  5Komentar

lahma picture lahma  ·  15Komentar

Jugolo picture Jugolo  ·  13Komentar

appel1 picture appel1  ·  25Komentar

asdfgasdfsafgsdfa picture asdfgasdfsafgsdfa  ·  17Komentar