Snabbtips Så här debuggar du ett AS3-fel # 2044

I den här snabba tipsen tar vi på körtid Fel 2044, det obehandlade IO-felet. Det är faktiskt väldigt enkelt, men det plågar även erfarna utvecklare, så vi kommer att gå djupgående och vända alla här till IO-fel ninjor.


Steg 1: Ställa in problemet

Låt oss börja med att ställa in någon kod i en Flash-fil som producerar fel 2044. Skapa en ny AS3 Flash-fil och skriv in den här koden i Script-panelen:

 var loader: Loader = ny Loader (); loader.load (ny URLRequest ("some-non existent.url"));

Fortsätt och kör SWF, och du bör se detta fel:

 Fel # 2044: Unhandled IOErrorEvent :. text = Fel # 2035: URL hittades inte.

Du kommer att se samma fel, med en liten variation om vi bara ändrar Lastare till URLLoader, som nedan:

 var loader: URLLoader = ny URLLoader (); loader.load (ny URLRequest ("some-non existent.url"));

Du borde se något så här, bara med filvägen som speglar din miljö:

 Fel # 2044: Unhandled ioError :. text = Fel # 2032: Strömfel. URL: fil: ////Volumes/Mac%20Pro/Users/dru/Library/Caches/TemporaryItems/non-existant.url på Untitled_fla :: MainTimeline / frame1 ()

Steg 2: Anklagad

Som du kanske kan övertyga från det faktum att fel 2044 uppgörs Lastare och URLLoader i bruk har detta fel något att göra med att ladda ut externa filer.

Faktum har faktiskt något att göra med fel att ladda en extern fil. Som den falska webbadressen i min kodsedlar skulle föreslå, är filen som vi försöker ladda, ett problem av något slag. Mest sannolikt är det fallet om filen är oåtkomlig; Det här kan helt enkelt vara en felstavad URL, eller en URL skapas dynamiskt vilket resulterar i en dålig plats, eller eftersom servern eller nätverket är nere just nu.

Fel 2044 anklagar dock inte att du laddar en dålig fil. Det kommer att hända. Vi kan inte styra nätverket, så ett lastfel måste hända någon gång. Fel 2044 anklagar dig för att inte vara beredd på när det händer.


Steg 3: Good Boy Scouts

Både Lastare och URLLoader är händelsespedagoger, som du borde veta från att arbeta med dem. Du måste använda Event.COMPLETE händelse för att veta när en last är redo för att du ska arbeta med den. Om du läser detta, kanske du inte inser att dessa laddningskurser också skickar ut andra händelser, särskilt IOErrorEvent.IO_ERROR händelse.

När en Lastare eller URLLoader möter ett misslyckande, såsom beskrivet i föregående steg, kommer det att skicka en IOErrorEvent.IO_ERROR händelse. Detta är en specialiserad händelse för fall som detta. Det bär en text egendom som beskriver felets art, sett i de fel som vi skapade i det första steget; båda kodproblemen producerade Error 2044, men texten av var var annorlunda (trots att den var semantiskt densamma).

Till skillnad från de flesta händelser, men när IOErrorEvents skickas skickar avsändaren kontrollen om förekomsten av minst en händelse lyssnare. Om det inte hittar något, kastar det det obehandlade IO-felet.

Så lösningen är enkel: Lägg bara till en lyssnare för IOErrorEvent.IO_ERROR händelse till din lastare (er). Även om lyssnaren inte gör någonting, kommer det åtminstone att undertrycka felet 2044, på grund av enbart befintlig.

 var loader: URLLoader = ny URLLoader; loader.load (ny URLRequest ("some-non existent.url")); loader.addEventListener (IOErrorEvent.IO_ERROR, onError); funktion onError (e: IOErrorEvent): void // Gör ingenting

Kom ihåg att du lägger till händelser i content egendom av Lastare objekt, inte till Lastare direkt:

 var loader: Loader = ny Loader (); loader.load (ny URLRequest ("some-non existent.url")); loader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, onError); funktion onError (e: IOErrorEvent): void // Gör ingenting

Men du borde vara bättre förberedd än det här, som en pojkescouter; du skulle helst bestämma vad en lämplig åtgärd skulle vara, börja sedan den åtgärden i händelsehanteringsfunktionen. Du kanske bestämmer dig för att ladda en? Bild som inte hittades? bild eller en standard XML-fil istället. Du kan kanske presentera en varning för användaren som meddelar dem att en nödvändig resurs inte kunde laddas, och ska försöka igen senare. Kanske inaktiverar du även delar av din SWF eftersom de nödvändiga uppgifterna inte kunde laddas. Du kan till och med släcka ett meddelande till en serverns logg med detaljer så att du kan titta på situationen.


Det är allt

Som jag nämnde är det här ganska enkelt, verkligen. Det är bara en fråga om att vana att lägga till den händelsehanteraren i första hand, så att du aldrig ser Error 2044 igen. Det kommer inte att förhindra att resursbelastning misslyckas, men det kan låta dig försämras graciöst och återhämta sig från felet så gott som du kan.

Tack för att du läser. Jag ses snart igen i en annan Debug Quick Tip.