Типы ошибок

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

При создании и запуске приложений программист может столкнуться с различными типами ошибок и проблемами, связанными с терминологией обработки ошибок. Ниже приводится список основных типов ошибок и соответствующих терминов.

  • Ошибки компиляции выявляются компилятором ActionScript во время составления кода. Ошибки компиляции возникают в том случае, когда проблемы в синтаксисе кода препятствуют созданию приложения.

  • Ошибки выполнения возникают после запуска скомпилированного приложения. Ошибки выполнения выявляются во время воспроизведения SWF-файла в среде выполнения Flash (например, в Adobe Flash Player или Adobe AIR). В большинстве случаев ошибки времени выполнения обрабатываются по мере возникновения, чтобы уведомить пользователя и предпринять меры для продолжения работы приложения. Если происходит фатальная ошибка, такая как отсутствие подключения к удаленному веб-сайту или невозможность загрузки требуемых данных, систему обработки ошибок можно использовать для корректного закрытия приложения.

  • Синхронные ошибки возникают при выполнении программы во время вызова функции, например при попытке использовать определенный метод, аргумент которого оказывается недействительным. Эти ошибки приводят к созданию исключения средой выполнения Flash. Большинство ошибок возникает синхронно, то есть в момент выполнения инструкции. При этом процесс управления немедленно переходит к наиболее приемлемой в данном случае инструкции catch .

    Например, следующий фрагмент кода генерирует ошибку выполнения, потому что метод browse() не был вызван перед тем, как программа попыталась загрузить файл:

    var fileRef:FileReference = new FileReference(); 
    try 
    { 
        fileRef.upload(new URLRequest("http://www.yourdomain.com/fileupload.cfm")); 
    } 
    catch (error:IllegalOperationError) 
    { 
        trace(error); 
        // Error #2037: Functions called in incorrect sequence, or earlier 
        // call was unsuccessful. 
    }

    В этом случае ошибка выполнения генерируется синхронно, поскольку Flash Player установил, что метод browse() не был вызван перед тем, как программа попыталась загрузить файл:

    Для получения подробной информации по этому вопросу см. раздел Обработка синхронных ошибок в приложении .

  • Асинхронные ошибки — это ошибки времени выполнения, возникающие вне нормального рабочего процесса программы. Они генерируют события, которые можно зарегистрировать прослушивателями. Асинхронные операции характеризуются тем, что функция инициирует данную операцию, но не ожидает ее завершения. Можно зарегистрировать прослушиватель событий ошибок, который будет следить за операциями приложения или пользователя. Если при выполнении какой-либо операции произойдет сбой, тогда с помощью прослушивателя событий можно будет перехватить ошибку и ответить на нее. Затем прослушиватель событий вызывает функцию обработчика событий, чтобы ответить на событие ошибки наиболее эффективным образом. Например, обработчик событий может открыть диалоговое окно, чтобы помочь пользователю устранить ошибку.

    Рассмотрите синхронную ошибку загрузки файла в примере, который был приведен выше. В случае успешного вызова метода browse() перед загрузкой файла Flash Player отправит несколько событий. Например, когда начнется загрузка, будет отправлено событие open . После успешного завершения операции загрузки файла отправляется событие complete . Поскольку обработка событий выполняется асинхронно (то есть она не происходит в заданное, известное или предсказуемое время), для отслеживания этих конкретных событий необходимо использовать метод addEventListener() , как показано в следующем коде:

    var fileRef:FileReference = new FileReference(); 
    fileRef.addEventListener(Event.SELECT, selectHandler); 
    fileRef.addEventListener(Event.OPEN, openHandler); 
    fileRef.addEventListener(Event.COMPLETE, completeHandler); 
    fileRef.browse(); 
     
    function selectHandler(event:Event):void 
    { 
        trace("...select..."); 
        var request:URLRequest = new URLRequest("http://www.yourdomain.com/fileupload.cfm"); 
        request.method = URLRequestMethod.POST; 
        event.target.upload(request); 
    } 
    function openHandler(event:Event):void 
    { 
        trace("...open..."); 
    } 
    function completeHandler(event:Event):void 
    { 
        trace("...complete..."); 
    }

    Для получения подробной информации об обработке асинхронных ошибок см. раздел Ответы на события ошибок и ошибки состояния .

  • Необработанные исключения представляют собой ошибки, генерирующиеся при отсутствии соответствующей логики, которая могла бы ответить на них (например, инструкция catch ). Если приложение генерирует ошибку, когда на текущем или более высоком уровне невозможно найти соответствующую инструкцию catch или обработчик событий для ответа на нее, тогда такая ошибка рассматривается как необработанное исключение.

    Когда обнаруживается неперехваченная ошибка, среда выполнения отправляет событие uncaughtError . Это событие также называется глобальным обработчиком ошибок. Это событие отправляется объектом UncaughtErrorEvents, который можно получить в SWF через свойство LoaderInfo.uncaughtErrorEvents . Если для события uncaughtError не зарегистрирован прослушиватель, среда выполнения игнорирует неперехваченные ошибки и пытается продолжить работу, пока ошибка не закроет SWF-файл.

    Помимо отправки события uncaughtError , отладочные версии среды выполнения Flash реагируют не неперехваченные ошибки путем прекращения текущего сценария. После этого неперехваченная ошибка выводится на экран с помощью инструкции trace или записывается в файле журнала. Если исключение является экземпляром класса Error или одного из его подклассов, в выходных данных будет отображена также информация трассировки стека. Дополнительные сведения об использовании отладочной версии среды выполнения Flash см. в разделе « Работа с отладочными версиями сред выполнения Flash ».

    Примечание. При обработке события uncaughtError, даже если событие ошибки генерируется из обработчика uncaughtError, обработчик событий вызывается несколько раз. В результате этого возникает бесконечный цикл исключений. Рекомендуется избегать подобных сценариев.