Consejo rápido Cómo depurar un error AS3 # 2044

En este Consejo rápido, asumiremos el Error 2044 en tiempo de ejecución, el error de E / S no manejado. En realidad es muy simple, pero afecta incluso a desarrolladores experimentados, así que profundizaremos y convertiremos a todos aquí en ninjas de error IO.


Paso 1: Configuración del problema

Comencemos configurando un código en un archivo Flash que produce el error 2044. Cree un nuevo archivo AS3 Flash e ingrese este código en el panel Script:

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

Continúe y ejecute el SWF, y debería ver este error:

 Error # 2044: IOErrorEvent no manejado :. texto = Error # 2035: URL no encontrada.

Verá el mismo error, con una ligera variación si cambiamos Cargador a URLLoader, como en el siguiente:

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

Debería ver algo como esto, solo con la ruta del archivo que refleja su entorno:

 Error # 2044: error no manejado :. texto = Error # 2032: Error de flujo. URL: file: ////Volumes/Mac%20Pro/Users/dru/Library/Caches/TemporaryItems/non-existant.url en Untitled_fla :: MainTimeline / frame1 ()

Paso 2: El Acusado

Como puede suponer por el hecho de que el Error 2044 surge de Cargador y URLLoader En uso, este error tiene algo que ver con la carga de archivos externos..

De hecho, el error tiene algo que ver con el fracaso para cargar un archivo externo. Como sugeriría la URL falsa en mis fragmentos de código, el archivo que estamos intentando cargar está teniendo algún tipo de problema. Lo más probable es que se trate de un archivo inalcanzable; esto podría ser simplemente una URL mal deletreada, o una URL que se está creando de forma dinámica y que se traduce en una ubicación incorrecta, o porque el servidor o la red están inactivos en este momento.

Sin embargo, el error 2044 no le está acusando de cargar un archivo incorrecto. Eso va a pasar. No podemos controlar la red, por lo que es probable que ocurra una falla de carga en algún momento. El error 2044 lo acusa de no estar preparado para cuando eso suceda.


Paso 3: Good Boy Scouts

Ambos Cargador y URLLoader son despachadores de eventos, como debe saber al trabajar con ellos. Necesitas utilizar el Evento.COMPLETO evento para saber cuándo una carga está lista para que usted trabaje con ella. Sin embargo, si está leyendo esto, es posible que no se dé cuenta de que estas clases de carga también distribuyen otros eventos, en particular el IOErrorEvent.IO_ERROR evento.

Cuando un Cargador o URLLoader encuentra una falla, tal como se describe en el paso anterior, enviará una IOErrorEvent.IO_ERROR evento. Este es un evento especializado para casos como este. Lleva un texto propiedad que describe la naturaleza del error, como se ve en los errores que creamos en el primer paso; ambos fragmentos de código produjeron el Error 2044, pero el texto de cada uno era diferente (aunque era semánticamente el mismo).

A diferencia de la mayoría de los eventos, sin embargo, cuando IOErrorEventCuando se despachan, el despachador verifica la existencia de al menos un detector de eventos. Si no encuentra ninguno, arroja el error de E / S no manejado..

Así que la solución es simple: simplemente agregue un oyente para el IOErrorEvent.IO_ERROR evento a su cargador (s). Incluso si el oyente no hace nada, al menos suprimirá el Error 2044, en virtud de la mera existencia.

 var loader: URLLoader = new URLLoader; loader.load (nueva URLRequest ("some-non-existant.url")); loader.addEventListener (IOErrorEvent.IO_ERROR, onError); función onError (e: IOErrorEvent): void // No hacer nada

Recuerda que agregas eventos a la contentLoaderInfo propiedad de Cargador objetos, no a la Cargador directamente:

 var loader: Loader = new Loader (); loader.load (nueva URLRequest ("some-non-existant.url")); loader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, onError); función onError (e: IOErrorEvent): void // No hacer nada

Sin embargo, debes estar mejor preparado que esto, como un boy scout; lo ideal sería determinar cuál sería la acción apropiada a tomar, y luego iniciar esa acción en la función del controlador de eventos. Usted podría decidir cargar una? Imagen no encontrada? imagen o un archivo XML predeterminado en su lugar. Puede presentar una alerta al usuario notificándoles que no se pudo cargar un recurso requerido, y debería intentarlo más tarde. Quizás también deshabilite partes de su SWF porque no se pudieron cargar los datos requeridos. Incluso puede lanzar un mensaje a un registro del lado del servidor con detalles, para que pueda ver la situación.


Eso es todo

Como mencioné, este es bastante fácil, de verdad. Es solo una cuestión de adquirir el hábito de agregar ese controlador de eventos en primer lugar, para que nunca vuelva a ver el Error 2044. No evitará que la carga de recursos falle, pero puede permitirle degradarse con gracia y recuperarse de la falla lo mejor que pueda..

Gracias por leer. Te veré de nuevo en breve en otro Consejo rápido de depuración.