如何處理網路應用程式中的例外狀況 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
本主題 說明在使用 JavaScript 和 HTML 編寫的 Windows 市集應用程式中使用網路 API 時,如何處理例外狀況。
您必須知道的事
技術
-
使用通訊端與 WebSocket 啟用網路通訊。
-
為 Windows 市集應用程式提供現代 HTTP 和 REST 用戶端 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 或 Managed C++ 之 .NET Framework 4.5 的應用程式中處理例外狀況的詳細資訊,請參閱處理網路應用程式中的例外狀況。
網路應用程式中的例外狀況
應用程式中發生例外狀況時,表示有嚴重的問題或失敗。發生例外狀況的原因很多。您的程式碼可能有造成例外狀況的問題。其他時候,特別是使用網路 API,例外狀況可能是網路連線改變及其他網路問題所造成的結果。
使用網路 API 發生例外狀況的原因包括下列項目:
- 參數驗證錯誤
- 查詢主機名稱或 URI 時名稱解析失敗
- 網路連線中斷
- 使用通訊端和 HTTP 用戶端 API 的網路連線失敗
- 網路伺服器或遠端端點錯誤
- 其他網路錯誤
網路錯誤 (例如,連線中斷、連線失敗、HTTP 伺服器故障) 的例外狀況可能隨時發生。 這些錯誤會造成擲出例外狀況。如果您的應用程式不處理例外狀況,它可能會造成您整個應用程式被執行階段終止。
您必須編寫程式碼,在呼叫大多數非同步網路方法時處理例外狀況。 有時候,在例外狀況發生時,會重試網路方法,試圖解決問題。其他時候,您的應用程式需要規劃,在沒有網路連線的情況下,使用之前快取的資料繼續工作。
Windows 執行階段應用程式通常會擲回單一例外狀況。您的例外狀況處理常式可以抓取例外狀況發生原因的更詳細資訊,更清楚地了解失敗的情況並作出適當的決定。
JavaScript 支援存取這個更詳細資訊的方法。例外狀況會在 Windows 執行階段應用程式中投影為 HRESULT 值。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);
}
}
相關主題
其他資源
參考