Cómo controlar excepciones en aplicaciones de red (HTML)
[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente
En este tema se explica cómo controlar excepciones al usar API de red en una aplicación de la Tienda Windows escrita en JavaScript y HTML.
Lo que debes saber
Tecnologías
-
Permite establecer comunicaciones de red con sockets y WebSockets.
-
Proporciona una API de cliente HTTP y REST moderna para aplicaciones de la Tienda Windows.
Requisitos previos
La siguiente información está destinada a las aplicaciones de la Tienda Windows que usan API para redes para establecer conexiones remotas. Este tema se aplica a las aplicaciones escritas en JavaScript y HTML para Windows 8.1, Windows Phone 8.1 o Windows Server 2012 R2.
Para obtener más información sobre cómo controlar excepciones en las aplicaciones de la Tienda Windows escritas en C++/XAML y en las aplicaciones que usan .NET Framework 4.5 en C#, VB.NET o C++ administrado para Windows 8.1, Windows Phone 8.1 o Windows Server 2012 R2, consulta Controlar excepciones en aplicaciones de red.
Excepciones en aplicaciones de red
Cuando se produce una excepción en una aplicación, significa que se produjo un error o problema significativo. Pueden producirse excepciones por varios motivos. El código puede tener problemas que pueden causar la excepción. Otras veces, en particular cuando se usan API de red, la excepción puede deberse a cambios en la conectividad de red y a otros problemas de red.
Entre los motivos de las excepciones al usar API de red se incluyen los siguientes:
- Errores de validación de parámetros
- Errores de resoluciones de nombre al buscar un URI o nombre de host
- Pérdida de la conectividad de red
- Errores en la conexión de red al usar sockets y API de cliente HTTP
- Errores del extremo remoto o del servidor de red
- Errores de red diversos
Las excepciones a causa de errores en la red (pérdida de la conectividad, errores de conexión y errores del servidor HTTP, por ejemplo) pueden producirse en cualquier momento. Estos errores hacen que se arrojen excepciones. Si tu aplicación no las controla, las excepciones pueden ocasionar que el tiempo de ejecución finalice la aplicación.
Debes escribir código para controlar las excepciones cuando llamas a la mayoría de los métodos de red asincrónicos. Algunas veces, cuando se produce una excepción, se puede reintentar un método de red para intentar solucionar el problema. Otras veces, la aplicación podría necesitar un plan para continuar sin conectividad de red usando los datos almacenados anteriormente en caché.
Las aplicaciones de Windows en tiempo de ejecución por lo general arrojan una sola excepción. Tu controlador de excepciones puede recuperar información más detallada sobre la causa de la excepción para comprender mejor el error y tomar las decisiones adecuadas.
JavaScript admite un método para obtener acceso a esta información más detallada. Una excepción se proyecta como un valor HRESULT en las aplicaciones de Windows en tiempo de ejecución. El archivo de inclusión Winerror.h contiene una lista muy extensa de posibles valores HRESULT que incluye errores de red.
Las API de red admiten distintos métodos para recuperar esta información detallada sobre la causa de una excepción.
- Un método auxiliar que convierte el valor HRESULT de la excepción en un valor de enumeración.
- El método sin procesar en función del lenguaje usado para recuperar el valor HRESULT.
Excepciones en Windows.Networking.Sockets
El espacio de nombres Windows.Networking.Sockets tiene enumeraciones y métodos auxiliares convenientes para controlar errores al usar sockets y WebSockets. Esto puede ser útil para controlar de un modo diferente excepciones de red específicas en la aplicación.
Un error en una operación DatagramSocket, StreamSocket o StreamSocketListener se devuelve como un valor HRESULT. El método SocketError.GetStatus se usa para convertir un error de red de una operación de socket en un valor de enumeración SocketErrorStatus. La mayoría de los valores de enumeración SocketErrorStatus corresponden a un error devuelto por la operación de Windows Sockets nativa. Una aplicación puede filtrar según valores de enumeración SocketErrorStatus específicos para modificar el comportamiento de la aplicación en función de la causa de la excepción.
Un error en una operación MessageWebSocket o StreamWebSocket se devuelve como un valor HRESULT. El método WebSocketError.GetStatus se usa para convertir un error de red de una operación de WebSocket en un valor de enumeración WebErrorStatus. La mayoría de los valores de enumeración WebErrorStatus corresponden a un error devuelto por la operación de cliente HTTP nativa. Una aplicación puede filtrar según valores de enumeración WebErrorStatus específicos para modificar el comportamiento de la aplicación en función de la causa de la excepción.
El siguiente código de ejemplo muestra cómo filtrar una excepción mediante la enumeración de WebErrorStatus.
var uri = new Uri("https://www.contoso.com");
var messageWebSocket = new Windows.Networking.Sockets.MessageWebSocket();
// Always catch network exceptions for async methods
messageWebSocket.ConnectAsync(uri).done(function () {
// get completed
}, onError);
function onError(reason) {
// Details in reason.message and reason.number
var errorStatus = Windows.Networking.Sockets.WebSocketError.getStatus(reason.number);
if (errorStatus === Windows.Web.WebErrorStatus.cannotConnect ||
errorStatus === Windows.Web.WebErrorStatus.notFound ||
errorStatus === Windows.Web.WebErrorStatus.requestTimeout) {
WinJS.log && WinJS.log("Cannot connect to the server");
}
else {
WinJS.log && WinJS.log("Failed to connect: " + errorStatus);
}
}
Para los errores de validación de parámetros, una aplicación también puede usar el HRESULT de la excepción para obtener información más detallada del error que causó la excepción. En las aplicaciones que usan JavaScript, el objeto Error representa un error durante la ejecución de la aplicación cuando se produce una excepción. La propiedad Error.number devuelve el valor HRESULT asignado a la excepción específica. Los valores HRESULT posibles se enumeran en el archivo de encabezado Winerror.h. Para la mayoría de errores de validación de parámetros, el HRESULT devuelto es E_INVALIDARG.
Excepciones en Windows.Networking.BackgroundTransfer
El espacio de nombres Windows.Networking.backgroundTransfer tiene prácticos métodos de ayuda y usa enumeraciones en el espacio de nombres Windows.Networking.Sockets para administrar los errores. Esto puede ser útil para controlar de un modo diferente excepciones de red específicas en la aplicación.
Un error encontrado en un método asincrónico en el espacio de nombres Windows.Networking.backgroundTransfer se devuelve como un valor HRESULT. El método BackgroundTransferError.GetStatus se usa para convertir un error de red de una operación de transferencia en segundo plano a un valor de enumeración WebErrorStatus. La mayoría de los valores de enumeración WebErrorStatus corresponden a un error devuelto por la operación del cliente HTTP o FTP nativa. Una aplicación puede filtrar según valores de enumeración WebErrorStatus específicos para modificar el comportamiento de la aplicación en función de la causa de la excepción.
Para los errores de validación de parámetros, una aplicación también puede usar el HRESULT de la excepción para obtener información más detallada del error que causó la excepción. En las aplicaciones que usan JavaScript, el objeto Error representa un error durante la ejecución de la aplicación cuando se produce una excepción. La propiedad Error.number devuelve el valor HRESULT asignado a la excepción específica. Los valores HRESULT posibles se enumeran en el archivo de encabezado Winerror.h. Para la mayoría de errores de validación de parámetros, el HRESULT devuelto es E_INVALIDARG.
Excepciones en Windows.Web.Http
El espacio de nombres Windows.Web.Http no tiene una función conveniente. Por lo que una aplicación que usa HttpClient y otras clases en este espacio de nombres debe usar el valor HRESULT.
En las aplicaciones que usan JavaScript, el objeto Error representa un error durante la ejecución de la aplicación cuando se produce una excepción. La propiedad Error.number devuelve el valor HRESULT asignado a la excepción específica. La propiedad Error.description devuelve el mensaje que describe la excepción. Sin embargo, algunas excepciones pueden carecer de valor para la propiedad Error.description. La mayoría de los valores HRESULT posibles se enumeran en el archivo de encabezado Winerror.h. Una aplicación puede filtrar según valores HRESULT específicos para modificar el comportamiento de la aplicación en función de la causa de la excepción.
Para la mayoría de errores de validación de parámetros, el HRESULT devuelto es E_INVALIDARG. Para algunas llamadas a métodos no válidas, el HRESULT devuelto es E_ILLEGAL_METHOD_CALL.
El siguiente código de ejemplo muestra cómo filtrar una excepción mediante HRESULT.
var uri = new Uri("http://example.com/datalist.aspx");
var httpClient = new HttpClient();
// Always catch network exceptions for async methods
httpClient.GetStringAsync(uri).done(function () {
// get completed
}, onError);
function onError(reason) {
// Details in error.message and error.number
var errorStatus = reason.number;
if (errorStatus === INET_E_RESOURCE_NOT_FOUND ||
errorStatus === INET_E_CANNOT_CONNECT ) {
WinJS.log && WinJS.log("Cannot connect to the server");
}
else {
WinJS.log && WinJS.log("Failed to connect: " + errorStatus);
}
}
Temas relacionados
Otros recursos
Agregar compatibilidad para redes
Cómo configurar opciones de conectividad en segundo plano
Transferencia de datos en segundo plano
Solución de problemas y depuración de las conexiones de red
Referencia