. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .




 
 
SEGÉDLETEK ActionScript alapok

Actionscript 3.0 alapok Adobe Flash CS3-ban
  feltöltve: 2007.10.11 | szerző: Reider | olvasva: 5952 alkalommal

               
 

Hibakezelés

Régebbi AS verziókban a hibák egyszerűen rejtve tudtak maradni, mivel többnyire a player lenyelte őket és nem értesített a bekövetkeztükről. Ha megpróbáltunk egy nem létező változóra hivatkozni általában csak az értékéből következtethettünk arra, hogy elírtunk valamit vagy rossz helyre hivatkoztunk. Ez komplikáltabb kódok esetén hosszas hibakeresést eredményezett és sok fejtörést. Ennek mostantól vége, a fejlesztőkörnyezet és a debug flash player minden hibáról értesít minket és arra is rámutat, hogy hol keletkeztek. A régi hibákkal ellentétben nem tudjuk megúszni a hibakezelést, ugyanis szinkron hibák esetén előfordulhat, hogy az utána következő kód nem fut le így fontos, hogy ezekre felkészüljünk.

Szinkron hibák

Ezek azok a hibák amelyek futás közben keletkeznek, valamelyik sornyi kód végrehajtása közben. Lehet az egy rossz típus konverzió vagy ha például egy null objektumon próbálunk változókat elérni. Az ilyen hibák keletkezésekor a player abbahagyja a kód futtatását és az Error osztály egy példányát dobja amit lehetőség van elkapni és lekezelni a try..catch..finally blokk segítségével. Próbáljunk meg elérni egy változót egy null objektumon:

var obj:Object
obj.x

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Untitled_fla::MainTimeline/Untitled_fla::frame1()

A fenti hibához hasonlót kell kapnunk, ami egy TypeError vagyis a TypeError osztály egy példánya amit akár a flash súgóban meg is találhatunk. Természetesen ez a hiba is az Error osztályból származik. Próbáljuk meg elkapni a hibát:

var obj:Object

try{
      obj.x
}catch(error:Error){
      trace("hiba")
}

Eredmény:
--------------------------
hiba
--------------------------

Most hogy mi kezeltük le a hibát akármit kiírhatunk helyette és a kódunk is tovább futhat vagy le is kezelhetjük. A try blokk elkap minden keletkező hibát és továbbküldi azt a catch-nek ahol hogyha a hiba a megfelelő típusú lefut a megfelelő catch blokk. Mivel a mi hibánk TypeError ezért az Error típusú paraméterrel azt is elkaphatjuk. Lehetőség van többféle típusú hiba figyelésére is több catch blokk létrehozásával azonban mindig haladjuk a legspecifikusabb hibától a legáltalánosabbig.

var obj:Object

try{
      obj.x
}catch(error:TypeError){
      trace("TypeError")
}catch(error:Error){
      trace("Error")
}

Eredmény:
--------------------------
TypeError
--------------------------

Lehetőség van a try..catch részt kiegészíteni egy finally blokkal ami mindenképpen lefut, ha hiba történt ha nem.

var obj:Object;
var errorHappened:Boolean

try {
      obj.x;
} catch (error:Error) {
      errorHappened = true
}finally{
      if(errorHappened){
             trace("Hiba történt")
      }else{
             trace("Nem volt hiba")
      }
}

Eredmény:
--------------------------
Hiba történt
--------------------------

Az Error osztály számos tulajdonsággal rendelkezik, amik segítségével lekérhetjük a hiba szövegét vagy a hiba típusát. Írassunk ki párat erek közül:

var obj:Object;

try {
      obj.x;
} catch (error:Error) {
      trace("Hiba ID: ",error.errorID)
      trace("Hiba üzenet: ",error.message)
      trace("Hiba neve: ",error.name)
}

Eredmény:
--------------------------
Hiba ID: 1009
Hiba üzenet: Error #1009: Cannot access a property or method of a null object reference.
Hiba neve: TypeError
--------------------------

Természetesen a try blokkban több sornyi kódot is elhelyezhetünk, azonban a hiba keletkezése utáni részek már nem fognak lefutni hanem ugrik a kód a catch részhez.

var obj:Object;

try {
      obj.x;
      trace("Hello")
} catch (error:Error) {
      trace("Hiba")
}

Eredmény:
--------------------------
Hiba
--------------------------

Aszinkron hibák

Ezek azok a hibák, amelyek aszinkron műveletek végrehajtása közben keletkeznek, ilyen lehet például a fájlok betöltése. Ezeket a hibákat nem tudjuk a fent bemutatott módszerrel lekezelni, mert mikor bekövetkeznek a kódunk már tovább futott. Aszinkron hibák jelzésére eseményeket generál a player amiket figyelőkkel el tudunk kapni. Ezeknek az eseményeknek az alapja az ErrorEvent osztály ami szintén alosztálya az Event-nek. Próbáljunk meg betölteni egy nem létező fájlt:

var loader:Loader = new Loader();
loader.load(new URLRequest("c:/none.swf"));

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.

Hasonló hibát kell kapnunk, ami arról tájékoztat, hogy egy lekezeletlen IOErrorEvent típusú esemény keletkezett. Ha figyelőket adunk ehhez az eseményhez azután már megszűnik ez a figyelmeztetés. A loader esetén ahogy arról már feljebb is szó volt a contentLoaderInfo-hoz kell ilyen figyelőket hozzáadnunk.

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onError)
loader.load(new URLRequest("c:/none"));

function onError(event:ErrorEvent):void{
      trace("Hiba Történt")
      trace("Hiba szövege: "+event.text)
}

Eredmény:
--------------------------
Hiba Történt
Hiba szövege: Error #2035: URL Not Found. URL: file:///c:/none
--------------------------

Minden osztálynál a súgóban fel vannak sorolva azok az események, amelyeket küldeni tud és ezek között a hibakezelő események is ott vannak.

 
               
 
 

© Devnet.hu. A segédletek semmilyen formában nem másolhatók, publikálhatók a Devnet.hu és a szerzők közös írásos engedélye nélkül.
 
. .. : Swf.hu 1.0 archívum : Swf.hu főoldal >>> : .. .