Kompiler ActionScript UncaughtErrorEvent

Setelah menggunakan asc2 untuk mengkompilasi aplikasi AIR, saya menemukan jejak kesalahan tumpukan hilang saat menangkap UncaughtErrorEvent.

Berikut ini contoh kodenya:

var root:Sprite = this;
root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,errorHandle);
throw new Error("test");

protected function errorHandle(event:UncaughtErrorEvent):void
        {
            var message:String; 
            if (event.error is Error) { 
                message = Error(event.error).message; 
                message+="\n"+Error(event.error).getStackTrace();
            } else if (event.error is ErrorEvent) { 
                message = ErrorEvent(event.error).text;
            } else { 
                message = event.error.toString(); 
            } 
        }

Saat menggunakan ASC1, saya dapat melihat jejak tumpukan penuh di pegangan kesalahan. Namun menggunakan ASC2, hanya pelacakan tumpukan kosong.

Ada yang punya masalah yang sama?

Bagaimana Anda mendapatkan jejak tumpukan UncaughtErrorEvent?


person hooh    schedule 18.04.2013    source sumber
comment
Apakah itu berfungsi saat mengkompilasi dengan sesuatu selain ASC2?   -  person Antoine Lassauzay    schedule 18.04.2013
comment
Pertama-tama, pertanyaannya disusun dengan sangat buruk sehingga saya tidak dapat mengeditnya agar dapat dibaca. Sulit untuk memahami apa yang menjadi milik satu sama lain dan saya tidak memahami pertanyaannya sepenuhnya. Kedua, Anda mendapatkan pesan kesalahan. Anda tidak memberi kami kode atau memberi tahu kami pada baris kode mana kesalahan terjadi. Kesalahan yang tidak tertangkap terjadi ketika kesalahan terjadi di luar blok try..catch mana pun atau ketika objek ErrorEvent dikirim tanpa pendengar yang terdaftar. Anda hanya mengatakan saya memiliki kesalahan dalam aplikasi saya, bantu saya. Bagaimana kita bisa melakukan itu?   -  person Joetjah    schedule 18.04.2013
comment
Saya minta maaf untuk itu dan saya telah mengeditnya kembali. Apakah sudah dijelaskan dengan jelas?   -  person hooh    schedule 22.04.2013


Jawaban (1)


Jangan masukkan event.error ke Error, seperti pada:

Error(event.error).getStackTrace()

Mendapatkan pelacakan tumpukan kesalahan akan mengembalikan tumpukan panggilan untuk kesalahan pada saat kesalahan dibuat sebagai string. Perhatikan bahwa nomor baris jejak tumpukan adalah garis pemeran.

Sebaliknya, panggil getStackTrace() dari event.error, seperti pada:

event.error.getStackTrace()

Tidak ada yang signifikan di tumpukan sesuai contoh Anda.

Menambahkan rekursi membantu menunjukkan masalahnya:

package
{
    import flash.display.Sprite;
    import flash.events.UncaughtErrorEvent;

    public class ExceptionTest extends Sprite
    {
        public function ExceptionTest()
        {
            super();

            loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
            recursion();
        }

        protected function recursion(depth:uint=0):void
        {
            if (depth == 5)
                throw new Error("test");
            else
                recursion(++depth);
        }

        protected function uncaughtErrorHandler(event:UncaughtErrorEvent):void
        {
            trace(event.error.getStackTrace());
        }
    }
}

...akan menghasilkan:

Error: test
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:19]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:13]
[SWF] Users:jsturges:dev:flash-workspace:X:bin-debug:ExceptionTest.swf - 1,745 bytes after decompression
Error: test
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:19]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:13]

Jika uncaughtErrorHandler() diubah ke contoh Anda yang dilemparkan ke Error, seperti pada:

protected function uncaughtErrorHandler(event:UncaughtErrorEvent):void
{
    trace(Error(event.error).getStackTrace());
}

Debugger menangkap pengecualian, tetapi getStackTrace adalah baris pemerannya:

Error: test
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:19]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest/recursion()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:21]
    at ExceptionTest()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:13]
[SWF] Users:jsturges:dev:flash-workspace:X:bin-debug:ExceptionTest.swf - 1,519 bytes after decompression
Error: Error: test
    at ExceptionTest/uncaughtErrorHandler()[/Users/jsturges/dev/flash-workspace/X/src/ExceptionTest.as:26]

Mungkin juga ada nuansa menyusun AS1 dan AS2 ke AS3 yang mendukung UncaughtErrorEvent mulai dari Flash Player 10.1.

Selain itu, pastikan pemutar debug sesuai dengan versi ActionScript. Dalam versi runtime non-debugger, metode Error.getStackTrace() mengembalikan null.

person Jason Sturges    schedule 22.04.2013