Typy błędów

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Podczas tworzenie i uruchamiania aplikacji użytkownik napotyka się na różne typy błędów i terminologię. Poniższa lista wprowadza główne typy błędów oraz terminy:

  • Błędy w czasie kompilowania zgłaszane są przez kompilator ActionScript podczas kompilacji kodu. Błędy w czasie kompilowania pojawiają się, gdy syntaktyczne problemy kodu użytkownika uniemożliwiają utworzenie aplikacji.

  • Błędy czasu wykonywania pojawiają się, gdy użytkownik uruchomi aplikację po jej skompilowaniu. Błędy czasu wykonania reprezentują błędy powstałe w czasie odtwarzania pliku SWF w środowisku wykonawczym Flash (takim jak program Adobe Flash Player lub środowisko Adobe AIR). W większości przypadków programista będzie miał możliwość obsługi błędów środowiska wykonawczego po ich pojawieniu się, zgłaszając je użytkownikowi i podejmując kroki, których celem jest nieprzerwane działanie aplikacji. Jeśli błąd jest błędem krytycznym np. nie ma możliwości połączenia ze zdalną stroną internetową lub załadowania żądanych danych, programista może użyć funkcji obsługi błędów, aby umożliwić poprawne zakończenie działania aplikacji.

  • Błędy synchroniczne są błędami środowiska wykonawczego, które pojawiają się w czasie wywoływania funkcji — na przykład, gdy programista spróbuje użyć konkretnej metody i przekazany zostanie nieprawidłowy argument, wówczas środowisko wykonawcze Flash wygeneruje wyjątek. Większość błędów pojawia się synchronicznie (w czasie wykonywania instrukcji), a przepływ sterowania przekazywany jest natychmiastowo do właściwej instrukcji catch .

    Na przykład w poniższym fragmencie kodu generowany jest błąd czasu wykonywania, ponieważ metoda browse() nie jest wywoływana, przed próbą przesłania pliku przez program:

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

    W tym przypadku błąd czasu wykonywania wygenerowany zostanie synchronicznie, ponieważ w programie Flash Player określono, że metoda browse() nie zostanie wywołana przed próbą przesłania pliku.

    Szczegółowe informacje na temat obsługi błędów synchronicznych zawiera sekcja Obsługa błędów synchronicznych w aplikacji .

  • Błędy asynchroniczne to błędy środowiska wykonawczego występujące poza normalnym przepływem programu. Generują one zdarzenia, które są przechwytywane przez detektory zdarzeń. Operacja asynchroniczna jest operacją, w której funkcja inicjuje operację, ale nie oczekuje na jej zakończenie. Istnieje możliwość utworzenia detektora zdarzenia błędu, który będzie oczekiwał na wykonanie pewnej operacji przez aplikację lub użytkownika. Jeśli operacja ta nie powiedzie się, za pomocą detektora zdarzeń programista przechwyci błąd i zareaguje na zdarzenie błędu. Następnie detektor zdarzeń wywoła funkcję obsługi zdarzenia w celu reakcji na zdarzenie błędu w użyteczny sposób. Na przykład moduł obsługi zdarzeń może uruchomić okno dialogowe, które wyśle monit do użytkownika w celu rozwiązania błędu.

    Należy rozważyć przykład zaprezentowanego wcześniej synchronicznego błędu przesyłania pliku. Pomyślne wywołanie metody browse() przed przesłaniem pliku powoduje, że program Flash Player wywołuje kilka zdarzeń. Na przykład: po rozpoczęciu przesyłania pliku wywoływane jest zdarzenie open . Po pomyślnym zakończeniu operacji przesyłania wywoływane jest zdarzenie complete . Obsługa zdarzeń jest asynchroniczna (tzn. nie odbywa się w konkretnym, znanym, ustalonym czasie), dlatego w celu wykrycia konkretnego zdarzenia należy użyć metody addEventListener() , co przedstawia poniższy kod:

    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..."); 
    }

    Szczegółowe informacje na temat obsługi błędów asynchronicznych zawiera sekcja Reagowanie na zdarzenia błędu i status .

  • Nie przechwycone wyjątki są błędami wygenerowanymi bez odpowiedniej logiki (np. instrukcja catch ), aby na nie zareagować. Jeśli aplikacja wygeneruje błąd, dla którego nie można odnaleźć w celu jego obsługi właściwej instrukcji catch lub modułu obsługi zdarzeń na poziomie bieżącym lub wyższym, błąd zostanie uznany za nie przechwycony wyjątek.

    Gdy pojawi się nieprzechwycony błąd, środowisko wykonawcze wywoła zdarzenie uncaughtError . To zdarzenie jest również określane jako globalny moduł obsługi błędów. To zdarzenie jest wywoływane przez obiekt UncaughtErrorEvents (w pliku SWF), do którego dostęp można uzyskać za pośrednictwem właściwości LoaderInfo.uncaughtErrorEvents . Jeśli żaden detektor nie został zarejestrowany dla zdarzenia uncaughtError , wówczas środowisko wykonawcze ignoruje nieprzechwycone błędy i podejmuje próby dalszego działania, pod warunkiem że błąd nie zatrzyma wykonywania pliku SWF.

    Oprócz wywołania zdarzenia uncaughtError środowiska wykonawcze Flash reagują na nieprzechwycone błędy poprzez zakończenie bieżącego skryptu. Następnie wyświetlają nieprzechwycony błąd w wyjściu instrukcji trace lub zapisują komunikat o błędzie w pliku dziennika. Jeśli obiekt wyjątku jest wystąpieniem klasy Error lub jednej z jej podklas, dane wyjściowe zawierają także informacje dotyczące stosu wywołań. Więcej informacji o korzystaniu z środowiska wykonawcze Flash w wersji debugera zawiera sekcja Praca z wersjami środowisk wykonawczych Flash wyposażonych w debuger .

    Uwaga: Jeśli podczas przetwarzania zdarzenia uncaughtError moduł obsługi zdarzeń uncaughtError wywoła zdarzenie error (zdarzenie błędu), moduł obsługi zdarzeń zostanie wywołany wiele razy. Doprowadzi to do nieskończonej pętli wyjątków. Zalecane jest unikanie takiego scenariusza.