如何处理网络应用中的异常 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

本主题 将介绍在使用以 JavaScript 和 HTML 编写的 Windows 应用商店应用中的网络 API 时,如何处理异常。

你需要了解的内容

技术

先决条件

  • 以下信息适用于使用网络 API 进行远程连接的 Windows 应用商店应用。本主题适用于针对 Windows 8.1、Windows Phone 8.1 或 Windows Server 2012 R2 采用 JavaScript 和 HTML 编写的应用。

    有关在以下应用中处理异常的详细信息,请参阅在网络应用中处理异常:针对 Windows 8.1、Windows Phone 8.1 或 Windows Server 2012 R2 采用 C++/XAML 编写的 Windows 应用商店应用,以及采用 C#、VB.NET 或托管 C++ 编写的使用 .NET Framework 4.5 的应用。

网络应用中的异常

应用中发生异常时,表示出现重大问题或失败。多种原因可引起异常。代码中可能具有导致异常的问题。其他时候,尤其在使用网络 API 时,更改网络连接和其他网络问题可能导致异常。

使用网络 API 时导致异常的原因包括以下几条:

  • 参数验证错误
  • 在查找主机名或 URI 时名称解析失败
  • 网络连接中断
  • 使用套接字和 HTTP 客户端 API 连接网络失败
  • 网络服务器或远程终结点错误
  • 各种网络错误

随时可能由网络错误(例如连接中断、连接失败和 HTTP 服务器失败)引发异常。 这些错误将引发异常。如果应用不处理异常,它可能导致整个应用在运行时终止。

当你调用大部分异步网络方法时,必须编写代码以处理异常。 有时,如果发生异常,可以重试网络方法来尝试解决问题。其他时候,应用可能需要计划使用之前的缓存数据在没有网络连接的情况下继续工作。

Windows 运行时应用通常引发单个异常。异常处理程序可以检索关于异常原因的详细信息,以更好地了解此次失败,并作出适当的判定。

JavaScript 支持访问该详细信息的方法。异常在 Windows 运行时应用中投影为 HRESULT 值。Winerror.h include 文件包含一个可能 HRESULT 值的大型列表,其中包含网络错误。

网络 API 支持不同方法来检索关于异常原因的详细信息。

  • 可以将来自异常的 HRESULT 值转换为枚举值的帮助程序方法。
  • 取决于检索 HRESULT 值时使用的语言的原始方法。

Windows.Networking.Sockets 中的异常

Windows.Networking.Sockets 命名空间具有方便的帮助程序方法和枚举,以便在使用套接字和 WebSocket 时处理错误。这有助于在应用中分别处理特定网络异常。

在进行 DatagramSocketStreamSocketStreamSocketListener 操作时发生的错误将以 HRESULT 值的形式返回。SocketError.GetStatus 方法用于将来自套接字操作的网络错误转化为 SocketErrorStatus 枚举值。大部分 SocketErrorStatus 枚举值对应由本机 Windows 套接字操作返回的错误。应用可以筛选特定 SocketErrorStatus 枚举值来基于异常原因修改应用行为。

在进行 MessageWebSocketStreamWebSocket 操作时发生的错误将以 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 头文件中列出。对于大部分参数验证错误,返回的 HRESULTE_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 头文件中列出。对于大部分参数验证错误,返回的 HRESULTE_INVALIDARG

Windows.Web.Http 中的异常

Windows.Web.Http 命名空间缺少方便函数。所以,使用 HttpClient 和该命名空间中其他类的应用需要使用 HRESULT 值。

在使用 JavaScript 的应用中发生异常时,Error 对象表示应用执行期间的错误。Error.number 属性将返回分配到特定异常的 HRESULTError.description 属性将返回用于描述异常的消息。 然而,某些异常可能缺少 Error.description 属性的值。大部分可能的 HRESULT 值将在 Winerror.h 头文件中列出。应用可以筛选特定 HRESULT 值来基于异常原因修改应用行为。

对于大部分参数验证错误,返回的 HRESULTE_INVALIDARG。对于非法的方法调用,返回的 HRESULTE_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);
    }
}

相关主题

其他资源

添加网络支持

如何设置后台连接选项

后台传送数据

网络连接的故障排除和调试

参考

HttpClient

MessageWebSocket

StreamSocket

StreamWebSocket

Windows.Networking.BackgroundTransfer

Windows.Networking.Sockets

Windows.Web.Http