Обработка исключений в сетевых приложениях (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]
В этом разделе описывается обработка исключений при использовании сетевых API в приложении Магазина Windows на JavaScript и HTML.
Что необходимо знать
Технологии
-
Устанавливает сетевые подключения с использованием сокетов и WebSocket.
-
Предоставляет современные клиентские API HTTP и REST для приложений Магазина Windows.
Необходимые условия
Следующие данные относятся к приложениям Магазина Windows, использующим сетевые API для установления удаленных подключений. Этот раздел применим к приложениям, написанным на JavaScript и HTML для Windows 8.1, Windows Phone 8.1 или Windows Server 2012 R2.
Подробнее об обработке исключений в приложениях Магазина Windows, написанных на C++ или XAML, и приложениях, использующих платформу .NET Framework 4.5 и написанных на C#, VB.NET или управляемом C++ для Windows 8.1, Windows Phone 8.1 или Windows Server 2012 R2: Обработка исключений в сетевых приложениях.
Исключения в сетевых приложениях
Исключение, возникающее в приложении, указывает на серьезную проблему или ошибку. Исключения могут возникать по многим причинам. В коде могут быть проблемы, вызывающие исключение. При использовании сетевых API исключение может возникать из-за изменений сетевого подключения и других проблем в сети.
Исключения при использовании сетевых API возникают по следующим причинам:
- ошибки при проверке параметров;
- ошибки разрешения имен при поиске имени узла или URI;
- потеря сетевого подключения;
- ошибки сетевого подключения с использованием сокетов или клиентских API HTTP;
- ошибки сетевого сервера или удаленных конечных точек;
- другие сетевые ошибки.
Исключения из-за сетевых ошибок (потеря подключения, ошибки подключения, ошибки HTTP-сервера и др.) могут возникать в любое время. Из-за таких ошибок создаются исключения. Если ваше приложение не обрабатывает исключение, то среда выполнения может завершить работу приложения.
При вызове большинства асинхронных сетевых методов вы должны указать код для обработки исключений. Иногда, когда возникает исключение, можно снова вызвать сетевой метод и устранить проблему. В других случаях приложение должно быть готово продолжить работу без подключения к сети, используя данные из кэша.
Приложения среды выполнения Windows обычно создают одно исключение. Обработчик исключений может получить подробную информацию о причине исключения, чтобы разобраться в проблеме и принять необходимые меры.
JavaScript поддерживает метод для доступа к подробной информации. Исключение проецируется в виде значения HRESULT в приложениях среды выполнения Windows. Winerror.h включает файл, содержащий большой список возможных значений HRESULT, в том числе сетевые ошибки.
Сетевые API поддерживают различные методы получения такой подробной информации о причине исключения.
- Вспомогательный метод, преобразующий значение HRESULT из исключения в значение перечисления.
- Непосредственный метод, зависящий от языка и получающий значение HRESULT.
Исключения в Windows.Networking.Sockets
Пространство имен Windows.Networking.Sockets содержит удобные вспомогательные методы и перечисления для обработки ошибок, возникающих при использовании сокетов и WebSocket. Это удобно, чтобы по-разному обрабатывать в приложении различные сетевые исключения.
Ошибка, обнаруженная в операции DatagramSocket, StreamSocket или StreamSocketListener, возвращается в виде значения HRESULT. Метод SocketError.GetStatus преобразует сетевую ошибку, произошедшую в операции с сокетом, в значение перечисления SocketErrorStatus. Большинство значений перечисления SocketErrorStatus соответствуют ошибке, возвращаемой стандартной операцией с сокетами Windows. Приложение может фильтровать полученные данные по определенному значению перечисления SocketErrorStatus, чтобы по-разному действовать в зависимости от причины исключения.
Ошибка, обнаруженная в операции MessageWebSocket или StreamWebSocket, возвращается в виде значения HRESULT. Метод WebSocketError.GetStatus преобразует сетевую ошибку, произошедшую в операции с WebSocket, в значение перечисления WebErrorStatus. Большинство значений перечисления WebErrorStatus соответствуют ошибке, возвращаемой стандартной операцией клиента HTTP. Приложение может фильтровать полученные данные по определенному значению перечисления WebErrorStatus, чтобы по-разному действовать в зависимости от причины исключения.
Следующий образец кода показывает, как фильтровать исключение с помощью перечисления 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);
}
}
Чтобы получить более подробные сведения об ошибке, которая вызвала исключение, для ошибок при проверке параметров приложение может использовать также HRESULT из исключения. В приложениях на JavaScript объект Error представляет ошибку во время выполнения приложения, при которой возникает исключение. Свойство Error.number возвращает значение HRESULT, назначенное определенному исключению. Возможные значения HRESULT перечислены в файле заголовка Winerror.h. Для многих ошибок при проверке параметров возвращаемым HRESULT является E_INVALIDARG.
Исключения в Windows.Networking.BackgroundTransfer
Пространство имен Windows.Networking.backgroundTransfer располагает удобными вспомогательными методами и использует перечисления в пространстве имен Windows.Networking.Sockets для обработки ошибок. Это удобно, чтобы по-разному обрабатывать в приложении различные сетевые исключения.
Ошибка, обнаруженная в асинхронном методе в пространстве имен Windows.Networking.backgroundTransfer, возвращается в виде значения HRESULT. Метод BackgroundTransferError.GetStatus преобразует сетевую ошибку, произошедшую в операции фоновой передачи, в значение перечисления WebErrorStatus. Большинство значений перечисления WebErrorStatus соответствуют ошибке, возвращаемой стандартной операцией клиента HTTP или FTP. Приложение может фильтровать полученные данные по определенному значению перечисления WebErrorStatus, чтобы по-разному действовать в зависимости от причины исключения.
Для ошибок при проверке параметров приложение может использовать также HRESULT из исключения, чтобы получить более подробные сведения об ошибке, которая вызвала исключение. В приложениях на JavaScript объект Error представляет ошибку во время выполнения приложения, при которой возникает исключение. Свойство Error.number возвращает значение HRESULT, назначенное определенному исключению. Возможные значения HRESULT перечислены в файле заголовка Winerror.h. Для многих ошибок при проверке параметров возвращаемым HRESULT является E_INVALIDARG.
Исключения в Windows.Web.Http
В пространстве имен Windows.Web.Http отсутствует удобная функция для обработки исключений. Поэтому приложение, использующее класс HttpClient и другие классы из этого пространства имен, должно обрабатывать значение HRESULT.
В приложениях на JavaScript объект Error представляет ошибку во время выполнения приложения, при которой возникает исключение. Свойство Error.number возвращает значение HRESULT, назначенное определенному исключению. Свойство Error.description возвращает сообщение с описанием исключения. Однако для некоторых исключений значение свойства Error.description может отсутствовать. Большинство возможных значений HRESULT перечислено в файле заголовка Winerror.h. Приложение может фильтровать полученные данные по определенному значению HRESULT, чтобы по-разному действовать в зависимости от причины исключения.
Для многих ошибок при проверке параметров возвращаемым HRESULT является E_INVALIDARG. Для некоторых незаконных вызовов методов возвращаемым HRESULT является E_ILLEGAL_METHOD_CALL.
Следующий образец кода показывает, как фильтровать исключение с помощью 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);
}
}
Связанные разделы
Другие ресурсы
Настройка параметров фонового подключения
Передача данных в фоновом режиме
Диагностика и отладка ошибок сетевых подключений
Ссылки