Frage

Ich bin mit einem Try-Catch-Block in dem folgenden Actionscript-3-Code:

try {
    this._subtitle = new SubtitleController(subtitlePath, _framerate);
    this._subtitle.addEventListener(Event.COMPLETE, subtitleLoaded);
}
catch (e:Error) {
    trace('subtitle not found');
}

Der SubtitleController Konstruktor versucht dann, die subtitlePath zu laden und wirft einen Error #2044: Unhandled ioError, aber der Fehler wird nicht durch die try Anweisung gefangen. Der Fehler wird einfach wie keine try Aussage geworfen jemals existiert hat.

Klar, ich kann mit diesem Code ersetzen

this._subtitle.addEventListener(IOErrorEvent.IO_ERROR, function (ev:Event) { trace('subtitle not loaded'); });
this._subtitle = new SubtitleController(subtitlePath, _framerate);
this._subtitle.addEventListener(Event.COMPLETE, subtitleLoaded);

und es funktioniert fast, hält er diesen Fehler trowing, aber eine andere wirft statt.

Aber ist nicht der ganze Sinn der try-catch Blöcke, das zu tun? Warum funktioniert es nicht mit dem try-catch arbeiten, aber es mit einem regelmäßigen Ereignis-Listener funktioniert?

War es hilfreich?

Lösung

IOErrors / NetworkErrors sind asynchrone Fehler. Sie werden nicht ausgelöst, wenn die Methode, um sie zu verursachen als normale Laufzeitfehler genannt wird. Sonst wäre die Ausführung hat zu stoppen vollständig, bis ein (zum Beispiel) eine Datei vollständig geladen ist ...

Andere Tipps

  

Im Grunde genommen, da der Anruf async a   try..catch..finally Block werden Sie nicht tun   ein Bohnen wenig gut. Es dauert eine Weile   für den Lader der URL zu bestimmen,   schlecht, und es löst dann die   IO_ERROR Ereignis.   - http: // www. mattmaher.net/flexible_code/index.php/2008/01/10/urlloader-stream-error-handling/

Theo ist richtig; Ich möchte nur hinzufügen, die IOErrorEvent Klasse des flash.events Pakets zu verwenden, um dies für jedermann zu behandeln, die die Methode nicht kannten.

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("test.mp3"));
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
function onIOError(e:IOErrorEvent):void
{
    trace("An IO Error has occured.\n\n", e);
}

Wenn Ihr mit einem Loader-Objekt zu arbeiten und nicht die URLLoader, denken Sie daran, dass Sie die Eigenschaft content des Loader-Objekts hören müssen wie folgt.

var loader:Loader = new Loader();
addChild(loader);

loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(new URLRequest("path/to/asset"));

function onIOError(e:IOErrorEvent):void
{
    trace("An IO Error has occured.\n\n", e);
}

Heute habe ich mit einer Klasse mit dem Namen log.as ist eine schlechte Idee. Fehler, die aus dieser Klasse geworfen nicht in einem Try-Catch fangen.

Ich glaube, sie waren vor gut. Ich habe mit Flexunit mit Unit-Tests, die Fehler zu erwarten. Ich habe AIR SDK 2.7 installiert und vor kurzem hinzugefügt AIR SDK 2.01 (für ein anderes Projekt), die den Konflikt ausgelöst hat.

Könnte eine Ecke Fall des älteren SDKs oder etwas Bestimmtes über meine Build-Umgebung sein.

Das Umbenennen der Klasse das Problem für mich gelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top