Schnelltipp So debuggen Sie einen AS3-Fehler Nr. 2044

In diesem Quick Tip nehmen wir den Laufzeitfehler 2044, den nicht behandelten E / A-Fehler, an. Es ist eigentlich sehr einfach, aber es plagt sogar erfahrene Entwickler, also gehen wir ausführlich vor und machen jeden hier zu IO-Fehler-Ninjas.


Schritt 1: Einrichten des Problems

Beginnen wir mit dem Einrichten eines Codes in einer Flash-Datei, der den Fehler 2044 verursacht. Erstellen Sie eine neue AS3 Flash-Datei, und geben Sie diesen Code in das Skriptfenster ein:

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

Führen Sie die SWF-Datei aus und Sie sollten diesen Fehler sehen:

 Fehler # 2044: Nicht behandeltes IOErrorEvent :. text = Fehler # 2035: URL nicht gefunden.

Sie werden den gleichen Fehler sehen, mit einer geringfügigen Abweichung, wenn wir uns nur ändern Lader zu URLLoader, wie unten:

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

Sie sollten so etwas sehen, nur mit dem Dateipfad, der Ihre Umgebung widerspiegelt:

 Fehler # 2044: Nicht behandelter ioError :. text = Fehler # 2032: Streamfehler. URL: Datei: ////Volumes/Mac%20Pro/Users/dru/Library/Caches/TemporaryItems/non-existant.url bei Untitled_fla :: MainTimeline / frame1 ()

Schritt 2: Der Angeklagte

Wie Sie vielleicht aus der Tatsache ahnen können, dass Error 2044 mit auftaucht Lader und URLLoader In Verwendung hat dieser Fehler etwas mit dem Laden von externen Dateien zu tun.

In der Tat hat der Fehler etwas mit dem zu tun Fehler eine externe Datei laden. Wie die gefälschte URL in meinen Code-Snippets vermuten lässt, hat die Datei, die wir laden möchten, ein gewisses Problem. Am wahrscheinlichsten ist es, dass die Datei nicht erreichbar ist. Dies kann einfach eine falsch geschriebene URL sein oder eine dynamisch erstellte URL, die zu einem fehlerhaften Speicherort führt oder weil der Server oder das Netzwerk zurzeit nicht in Betrieb ist.

Fehler 2044 beschuldigt Sie jedoch nicht, eine fehlerhafte Datei zu laden. Das wird passieren. Wir können das Netzwerk nicht kontrollieren, daher kommt es an einem Punkt zu einem Lastausfall. Der Fehler 2044 wirft Ihnen vor, nicht darauf vorbereitet zu sein.


Schritt 3: Gute Pfadfinder

Beide Lader und URLLoader sind Event-Dispatcher, wie Sie es von ihrer Arbeit kennen sollten. Sie müssen das nutzen Event.COMPLETE Ereignis, um zu wissen, wann eine Ladung für Sie bereit ist, damit zu arbeiten. Wenn Sie dies lesen, werden Sie möglicherweise nicht erkennen, dass diese Ladeklassen auch andere Ereignisse auslösen, insbesondere die IOErrorEvent.IO_ERROR Veranstaltung.

Wenn ein Lader oder URLLoader stößt ein Fehler auf, wie im vorherigen Schritt beschrieben, wird ein Fehler gemeldet IOErrorEvent.IO_ERROR Veranstaltung. Dies ist eine spezialisierte Veranstaltung für solche Fälle. Es trägt eine Text Eigenschaft, die die Art des Fehlers beschreibt, wie aus den Fehlern ersichtlich, die wir im ersten Schritt erstellt haben; beide Codeausschnitte erzeugten Fehler 2044, aber der Text war unterschiedlich (obwohl er semantisch gleich war).

Im Gegensatz zu den meisten Ereignissen, wenn IOErrorEventWenn der Dispatcher versendet wird, prüft der Dispatcher, ob mindestens ein Ereignis-Listener vorhanden ist. Wenn es keinen findet, wirft es den nicht behandelten E / A-Fehler.

Die Lösung ist also einfach: Fügen Sie einfach einen Listener für die hinzu IOErrorEvent.IO_ERROR Ereignis an Ihren Lader (n). Selbst wenn der Hörer nichts tut, unterdrückt er zumindest den Fehler 2044, indem er lediglich existiert.

 var loader: URLLoader = neuer URLLoader; loader.load (neue URLRequest ("some-non-existant.url")); loader.addEventListener (IOErrorEvent.IO_ERROR, onError); Funktion onError (e: IOErrorEvent): void // Nichts tun

Denken Sie daran, dass Sie Ereignisse zum hinzufügen contentLoaderInfo Eigentum von Lader Objekte, nicht auf die Lader direkt:

 var loader: Loader = neuer Loader (); loader.load (neue URLRequest ("some-non-existant.url")); loader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, onError); Funktion onError (e: IOErrorEvent): void // Nichts tun

Sie sollten jedoch besser darauf vorbereitet sein, wie ein Pfadfinder. Sie würden im Idealfall festlegen, welche geeignete Aktion ausgeführt werden soll, und dann diese Aktion in der Ereignisbehandlungsfunktion starten. Sie können sich entscheiden, ein Bild zu laden, das nicht gefunden wurde. Image oder eine XML-Standarddatei. Sie könnten dem Benutzer eine Warnung anzeigen, dass er die erforderliche Ressource nicht laden konnte, und es später erneut versuchen sollte. Möglicherweise deaktivieren Sie auch Teile Ihrer SWF, da die erforderlichen Daten nicht geladen werden konnten. Sie können sogar eine Nachricht mit Details an ein serverseitiges Protokoll senden, sodass Sie die Situation überprüfen können.


Das ist alles

Wie gesagt, dieser ist ziemlich einfach. Es ist nur eine Frage der Gewohnheit, diesen Event-Handler von vornherein hinzuzufügen, so dass Sie Fehler 2044 nie wieder sehen. Es verhindert zwar nicht, dass das Laden von Ressourcen fehlschlägt, es kann jedoch dazu führen, dass Sie sich ordnungsgemäß abbauen und den Fehler so gut wie möglich beheben.

Danke fürs Lesen. Wir sehen uns in Kürze in einem weiteren Debug Quick Tip.