How to catch all exceptions in Flex?

前端 未结 9 714
广开言路
广开言路 2020-11-29 23:39

When I run a Flex application in the debug flash player I get an exception pop up as soon as something unexpected happened. However when a customer uses the application he d

相关标签:
9条回答
  • 2020-11-30 00:11

    There is a bug/feature request for this in the Adobe bug management system. Vote for it if it's important to you.

    http://bugs.adobe.com/jira/browse/FP-444

    0 讨论(0)
  • 2020-11-30 00:14

    There is no way to be notified on uncaught exceptions in Flex 3. Adobe are aware of the problem but I don't know if they plan on creating a workaround.

    The only solution as it stands is to put try/catch in logical places and make sure you are listening to the ERROR (or FAULT for webservices) event for anything that dispatches them.

    Edit: Furthermore, it's actually impossible to catch an error thrown from an event handler. I have logged a bug on the Adobe Bug System.

    Update 2010-01-12: Global error handling is now supported in Flash 10.1 and AIR 2.0 (both in beta), and is achieved by subscribing the UNCAUGHT_ERROR event of LoaderInfo.uncaughtErrorEvents. The following code is taken from the code sample on livedocs:

    public class UncaughtErrorEventExample extends Sprite
    {
        public function UncaughtErrorEventExample()
        {
            loaderInfo.uncaughtErrorEvents.addEventListener(
                UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
        }
    
        private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
        {
            if (event.error is Error)
            {
                var error:Error = event.error as Error;
                // do something with the error
            }
            else if (event.error is ErrorEvent)
            {
                var errorEvent:ErrorEvent = event.error as ErrorEvent;
                // do something with the error
            }
            else
            {
                // a non-Error, non-ErrorEvent type was thrown and uncaught
            }
        }
    
    0 讨论(0)
  • 2020-11-30 00:14

    Alternative to accepted answer, using try-catch. Slower, but more straightforward to read, I think.

    try {
        loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError);
    } catch (e:ReferenceError) {
        var spl:Array = Capabilities.version.split(" ");
        var verSpl:Array = spl[1].split(",");
    
        if (int(verSpl[0]) >= 10 &&
            int(verSpl[1]) >= 1) {
            // This version is 10.1 or greater - we should have been able to listen for uncaught errors...
            d.warn("Unable to listen for uncaught error events, despite flash version: " + Capabilities.version);
        }
    }
    

    Of course, you'll need to be using an up-to-date 10.1 playerglobal.swc in order to compile this code successfully: http://labs.adobe.com/downloads/flashplayer10.html

    0 讨论(0)
  • 2020-11-30 00:28

    It works in Flex 3.3.

     if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
        IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
     }
    
    0 讨论(0)
  • 2020-11-30 00:29

    Note that bug FP-444 (above) links to http://labs.adobe.com/technologies/flashplayer10/features.html#developer that since Oct 2009 shows that this will be possible as of 10.1, which currently, Oct 28, 2009 is still unreleased - so I guess we'll see if that is true when it gets released

    0 讨论(0)
  • 2020-11-30 00:30

    I attached the event listener to the 'root', which worked for me:

    sprite.root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
    

    In the debug Flash Player this will still error, but in the non-debug version the error will appear in Flash Player's dialog box - and then the handler will respond. To stop the dialog box from appearing, add:

    event.preventDefault();
    

    so:

        private function onUncaughtError(event:UncaughtErrorEvent):void
        {
            event.preventDefault();
            // do something with this error
        }
    

    I was using this in AIR, but I assume it works for standard AS3 projects too.

    0 讨论(0)
提交回复
热议问题