Flash.jpw

  • Obecné
  • Adobe Flash
  • ActionScript 1 & 2.0
  • ActionScript 3.0
  • ActionScript 1 & 2.0

  • Úvod do ActionScriptu
  • Proměnné, pole a generický objekt
  • Podmínky a smyčky
  • Funkce
  • Úvod do objektů
  • Vlastní třídy
  • Objekty CORE
  • Objekty MOVIE
  • Výjimky
  • Asynchronní události
  • Předchozí: Objekty MOVIE
  • Následující: Asynchronní události
  • Výjimky

    Výjimka (první dlouhé, druhé krátké - v životě jsem to snad nenapsal správně), anglicky Exception, je chybová struktura, kterou může skript vyslat jako signál, že něco neproběhlo normálně. U objektových jazyků jsou synchronní runtime chyby signalizovány velmi často výjimkami.

    Vyhození vlastní výjimky (throw)

    Je obecně doporučováno řešit očekávané výjimečné stavy (a nemusí jít jen o chyby) výjimkami.

    Výjimka je běžný objekt, nejčastěji předdefinovaný Error, ale můžete použít jakýkoliv jiný předdefinovaný nebo vlastní. Objekt jako výjimku vyšlete příkazem throw (doslova vyhodit).

    throw new Error('File not found');

    Zachycení výjimky (try..catch)

    Když vyhodíte výjimku, stoupá směrem vzhůzu objektovým stromem. To znamená od potomků k rodičům. Kdekoliv po cestě je možné ji zachytit. A v tom je celé kouzlo.

    function divide(divident:Number, divisor:Number):Number{
    	if(divisor == 0){
    		throw new Error('Division by zero');
    		// příkaz throw ukončuje aktuální blok, podobně jako return
    	}
     
    	return divident/divisor;
    }
     
    try {
    	var hodnota = divide(25, 0);
    } catch(e:Error){
    	_root.chybovazprava.text = e.toString();
    	// textovému poli chybovazprava je nastavena hodnota 'Division by zero'
    }

    Vidíte, že kontrolovaný skript je uvnitř bloku try (zkusit). Případnou zachycenou výjimku je pak možné zpracovat blokem catch (zachytit).

    Možná ještě drobná lingvistická odbočka, catch je nepravidelné sloveso, nezachycený je tedy uncaught.

    Zachycení více druhů výjimek

    Vidíte, že v předchozím případě zachycujeme objekt Error. Blok catch zachytí objekt, jen když souhlasí definovaný datový typ. Pokud chceme zachytit více typů, je třeba definovat více catch bloků.

    catch bez definovaného typu zachytí jakýkoliv objekt.

    function divide(divident:Number, divisor:Number):Number{
    	if(divisor == 0) throw new String('Division by zero');
    	return divident/divisor;
    }
     
    try {
    	var hodnota = divide(25, 0);
    } catch(e:Error){
    	_root.chybovazprava.text = e.toString();
    } catch(e:String){	// tento blok zachytí výjimku
    	_root.chybovazprava.text = e;
    } catch(e) {
    	trace(e);
    }

    Opětovné vyhození

    Možná vás to už napadlo, pro jistotu to ale zdůrazním. Zachycenou výjimku je možné samozřejmě znovu vyhodit - poslat ke zpracování vyšší úrovni.

    V našem případě bychom kontrolovali jen jednu hodnotu výjimky, ostatní bychom posílali dál.

    try {
    	var hodnota = divide(25, 0);
    } catch(e:String){
    	if(e != 'Division by zero'){
    		throw e;
    	}
    	_root.chybovazprava.text = e;
    }

    Borec na konec (finally)

    Vzhledem k tomu, že throw ukončuje aktuální funkci nebo metodu, přináší to problém, pokud je potřeba po kontrolované akci provést nějakou další, bez ohledu na to, jestli došlo k chybě nebo ne.

    K tomu slouží blok finally (nakonec).

    var hodnota = 0;
     
    try {
    	hodnota += divide(25, 0);
    } catch(e:String){
    	trace(e);
    } finally {
    	_root.zobrazit.text = hodnota;	
    }

    Blok finally je vykonán vždy, bez ohledu na zachycené nebo nezachycené výjimky.

    Výjimky se nedají použít na asynchronní chybové stavy

    Strukturou try..catch nemůžete zachycovat asynchronní události, jako například nenalezení cílového serveru a podobně. V době vzniku události už je totiž blok try dávno opuštěn.

    Takovéto chyby se zpracovávají jako jakákoliv jiná asynchronní událost, tedy příslušným event-handlerem či listenerem.