Question

J'utilise un bloc try-catch dans le code Actionscript 3 suivant:

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

Le constructeur SubtitleController tente alors de charger le subtitlePath et jette un Error #2044: Unhandled ioError, mais l'erreur ne se coince pas la déclaration de try. L'erreur est tout simplement jeté comme aucune déclaration de try jamais existé.

Bien sûr, je peux remplacer ce code avec

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);

et il fonctionne presque, il arrête trowing cette erreur, mais jette un autre à la place.

Mais n'est pas le point de l'ensemble des blocs de try-catch pour le faire? Pourquoi cela ne fonctionne pas avec le try-catch, mais il fonctionne avec un écouteur d'événement régulier?

Était-ce utile?

La solution

IOErrors / NetworkErrors sont des erreurs asynchrones. Ils ne sont pas jetés lorsque la méthode est appelée provoquant des erreurs d'exécution normales. Sinon, l'exécution aurait dû arrêter complètement jusqu'à ce qu'un (par exemple) un fichier est complètement chargé ...

Autres conseils

  

En fait, l'appel est un async   bloc try..catch..finally ne vous fera pas   un peu de haricots de bonne. Il faut un certain temps   pour le chargeur pour déterminer l'URL est   mauvais et il envoie la   événement IO_ERROR.   - http: // www. mattmaher.net/flexible_code/index.php/2008/01/10/urlloader-stream-error-handling/

Theo est correct; Je voudrais ajouter simplement d'utiliser la classe IOErrorEvent du paquet flash.events pour gérer ce pour tous ceux qui ne connaissaient pas la méthode.

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);
}

Si votre travail avec un objet Loader et non le URLLoader, rappelez-vous que vous devez écouter la propriété contentLoaderInfo de l'objet Loader comme suit.

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);
}

Aujourd'hui, j'ai trouvé avoir une classe nommée est une mauvaise idée log.as . Les erreurs lancées de cette classe ne se coincent pas dans un try-catch.

Je pense qu'ils étaient bien avant. Je l'ai utilisé avec FlexUnit tests unitaires qui attendent des erreurs. Je AIR SDK 2.7 installé et a récemment ajouté AIR SDK 2.01 (pour un autre projet) qui peut avoir initié le conflit.

Peut-être un cas d'angle des SDKs plus âgés ou quelque chose de spécifique au sujet de mon environnement de construction.

Changement de nom de la classe a résolu le problème pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top