Snelle tip Hoe een AS3-fout nr. 2044 te debuggen

In deze Snelle tip nemen we runtime Error 2044, de niet-afgehandelde IO-fout, over. Het is eigenlijk heel simpel, maar het is zelfs een probleem voor ervaren ontwikkelaars, dus we zullen dieper ingaan en iedereen hier veranderen in IO error ninjas.


Stap 1: het probleem instellen

Laten we beginnen met het instellen van een code in een Flash-bestand dat fout 2044 produceert. Maak een nieuw AS3 Flash-bestand en voer deze code in het Script-venster in:

 var loader: Loader = new Loader (); loader.load (nieuwe URLRequest ("some-non-existant.url"));

Ga je gang en voer de SWF uit, en je zou deze fout moeten zien:

 Fout # 2044: Onbehandelde IOErrorEvent :. text = Fout # 2035: URL niet gevonden.

Je ziet dezelfde fout, met een kleine variatie als we alleen veranderen lader naar URLLoader, zoals hieronder:

 var loader: URLLoader = new URLLoader (); loader.load (nieuwe URLRequest ("some-non-existant.url"));

U zou zoiets moeten zien, alleen met het bestandspad dat uw omgeving weerspiegelt:

 Fout # 2044: Onbehandelde ioError :. text = Fout # 2032: Streamfout. URL: bestand: ////Volumes/Mac%20Pro/Users/dru/Library/Caches/TemporaryItems/non-existant.url bij Untitled_fla :: MainTimeline / frame1 ()

Stap 2: The Accused

Zoals je misschien kunt opmaken uit het feit dat Error 2044 opduikt lader en URLLoader in gebruik heeft deze fout iets te maken met het laden van externe bestanden.

In feite heeft de fout iets te maken met de mislukking om een ​​extern bestand te laden. Zoals de nep-URL in mijn codefragmenten zou suggereren, heeft het bestand dat we proberen te laden een of ander probleem. Hoogstwaarschijnlijk is het een kwestie van onbereikbaar zijn van het bestand; dit kan gewoon een verkeerd gespelde URL zijn, of een dynamische URL die resulteert in een slechte locatie, of omdat de server of het netwerk op dat moment leeg is.

Fout 2044 beschuldigt u echter niet van het laden van een slecht bestand. Dat gaat gebeuren. We kunnen het netwerk niet besturen, dus een belastingstoornis zal op een gegeven moment onvermijdelijk zijn. Fout 2044 beschuldigt u van niet voorbereid te zijn wanneer dat gebeurt.


Stap 3: Good Boy Scouts

Beide lader en URLLoader zijn event dispatchers, zoals u zou moeten weten als u met hen werkt. U moet de. Gebruiken Event.COMPLETE evenement om te weten wanneer een lading klaar is om ermee te werken. Als je dit echter aan het lezen bent, realiseer je je misschien niet dat deze laadklassen ook andere evenementen verzenden, met name de IOErrorEvent.IO_ERROR evenement.

Wanneer een lader of URLLoader een fout tegenkomt, zoals beschreven in de vorige stap, verzendt het een IOErrorEvent.IO_ERROR evenement. Dit is een gespecialiseerde gebeurtenis voor gevallen zoals deze. Het draagt ​​een tekst eigenschap die de aard van de fout beschrijft, zoals gezien in de fouten die we in de eerste stap hebben gemaakt; beide codefragmenten produceerden Error 2044, maar de tekst van elk ervan was anders (hoewel het semantisch hetzelfde was).

In tegenstelling tot de meeste evenementen echter IOErrorEvents worden verzonden, controleert de coördinator of er ten minste één gebeurtenislistener is. Als er geen wordt gevonden, wordt de niet-afgehandelde IO-fout gegenereerd.

Dus de oplossing is simpel: voeg eenvoudig een luisteraar toe voor de IOErrorEvent.IO_ERROR evenement naar uw loader (s). Zelfs als de luisteraar niets doet, zal het op zijn minst de Error 2044 onderdrukken op grond van alleen maar bestaan.

 var loader: URLLoader = nieuwe URLLoader; loader.load (nieuwe URLRequest ("some-non-existant.url")); loader.addEventListener (IOErrorEvent.IO_ERROR, onError); function onError (e: IOErrorEvent): void // Do nothing

Vergeet niet dat je afspraken toevoegt aan de contentLoaderInfo eigendom van lader objecten, niet naar de lader direct:

 var loader: Loader = new Loader (); loader.load (nieuwe URLRequest ("some-non-existant.url")); loader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, onError); function onError (e: IOErrorEvent): void // Do nothing

Je moet echter beter voorbereid zijn dan dit, zoals een padvinder; u zou idealiter bepalen wat een geschikte actie is om te nemen, en dan die actie starten in de gebeurtenishandlerfunctie. U zou kunnen besluiten om een? Afbeelding te laden die niet gevonden is? afbeelding of een standaard XML-bestand. U kunt de gebruiker laten weten dat een vereiste bron niet kan worden geladen en moet later opnieuw proberen. Misschien schakelt u ook delen van uw SWF uit omdat de vereiste gegevens niet konden worden geladen. U kunt zelfs een bericht naar een serverlogboek met gegevens activeren, zodat u de situatie kunt bekijken.


Dat is alles

Zoals ik al zei, deze is vrij eenvoudig, echt waar. Het is gewoon een kwestie van de gewoonte krijgen om die gebeurtenishandler in de eerste plaats toe te voegen, zodat u Error 2044 nooit meer zult zien. Het zal niet voorkomen dat het laden van resources mislukt, maar het kan je net zo goed laten degraderen als je kunt en zo goed mogelijk herstellen van de fout..

Bedankt voor het lezen. Ik zie je binnenkort weer in een andere snelle foutopsporing.