คอมไพเลอร์ ActionScript UncaughtErrorEvent

หลังจากใช้ asc2 เพื่อคอมไพล์แอปพลิเคชัน AIR ฉันพบว่าการติดตามสแต็กข้อผิดพลาดหายไปขณะตรวจจับ UncaughtErrorEvent

นี่คือโค้ดตัวอย่าง:

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(); 
            } 
        }

ในขณะที่ใช้ ASC1 ฉันสามารถเห็นการติดตามสแต็กทั้งหมดในการจัดการข้อผิดพลาด แต่การใช้ ASC2 เป็นเพียงการติดตามสแต็กที่ว่างเปล่า

ใครมีปัญหาเดียวกันบ้างไหม?

คุณจะได้รับการติดตามสแต็ก UncaughtErrorEvent ได้อย่างไร


person hooh    schedule 18.04.2013    source แหล่งที่มา
comment
มันใช้งานได้เมื่อคอมไพล์กับอย่างอื่นที่ไม่ใช่ ASC2 หรือไม่?   -  person Antoine Lassauzay    schedule 18.04.2013
comment
ก่อนอื่นเลย คำถามถูกรวบรวมไว้แย่มาก ฉันไม่สามารถแก้ไขเพื่อให้อ่านได้ มันยากที่จะเข้าใจว่าอะไรเป็นของกันและกันและฉันไม่เข้าใจคำถามอย่างถ่องแท้ ประการที่สอง คุณได้รับข้อความแสดงข้อผิดพลาด คุณไม่ได้ให้รหัสแก่เราหรือแจ้งให้เราทราบว่าบรรทัดใดในรหัสที่เกิดข้อผิดพลาด ข้อผิดพลาดที่ไม่ถูกตรวจจับเกิดขึ้นเมื่อมีข้อผิดพลาดเกิดขึ้นนอกบล็อก try..catch ใดๆ หรือเมื่อมีการส่งออบเจ็กต์ ErrorEvent โดยไม่มี Listener ที่ลงทะเบียนไว้ คุณแค่บอกว่าฉันมีข้อผิดพลาดในใบสมัครของฉัน ช่วยฉันด้วย เราควรจะทำเช่นนั้นได้อย่างไร?   -  person Joetjah    schedule 18.04.2013
comment
ฉันขอโทษสำหรับมันและฉันได้แก้ไขมันใหม่แล้ว อธิบายไว้ชัดเจนมั้ย?   -  person hooh    schedule 22.04.2013


คำตอบ (1)


อย่าแปลง event.error ถึง Error ดังเช่นใน:

Error(event.error).getStackTrace()

การรับการติดตามสแต็กของข้อผิดพลาดจะส่งคืน call stack สำหรับข้อผิดพลาดในขณะที่สร้างข้อผิดพลาดเป็นสตริง โปรดทราบว่าหมายเลขบรรทัดของการติดตามสแต็กคือบรรทัดของการร่าย

ให้โทร getStackTrace() จาก event.error แทน เช่น:

event.error.getStackTrace()

ไม่มีอะไรสำคัญในสแต็กตามตัวอย่างของคุณ

การเพิ่มการเรียกซ้ำช่วยสาธิตปัญหา:

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());
        }
    }
}

...จะผลิต:

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]

หาก uncaughtErrorHandler() ถูกเปลี่ยนเป็นตัวอย่างของคุณเป็น Error ดังเช่นใน:

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

ดีบักเกอร์จับข้อยกเว้น แต่ getStackTrace เป็นบรรทัดของการส่ง:

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]

อาจมีความแตกต่างในการจัดเรียง AS1 และ AS2 เป็น AS3 ซึ่งรองรับ UncaughtErrorEvent เริ่มต้นที่ Flash Player 10.1

นอกเหนือจากนั้น ตรวจสอบให้แน่ใจว่าโปรแกรมเล่นดีบักที่เหมาะสมตามเวอร์ชัน ActionScript ในเวอร์ชันรันไทม์ที่ไม่ใช่ดีบักเกอร์ เมธอด Error.getStackTrace() จะส่งคืน null

person Jason Sturges    schedule 22.04.2013