try-catch nicht funktioniert?
-
22-08-2019 - |
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?
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.