ネットワーク アプリで例外を処理する方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
このトピックでは、JavaScript と HTML で記述された Windows ストア アプリで Networking API を使う場合に例外を処理する方法について説明します。
理解しておく必要があること
テクノロジ
-
ソケットと WebSocket を使ったネットワーク通信を可能にします。
-
Windows ストア アプリに最新の HTTP および REST クライアント API を提供します。
必要条件
以下の情報は、Networking 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 を使ったアプリでの例外の処理について詳しくは、「ネットワーク アプリで例外を処理する方法」をご覧ください。
ネットワーク アプリでの例外
アプリでの例外の発生は、重大な問題やエラーを示します。例外はさまざまな理由で発生します。コードに問題があって、例外が発生することがあります。また、特に Networking API を使う場合に、ネットワーク接続の変更やその他のネットワークの問題のために例外が発生することもあります。
Networking API を使う場合の例外の理由には、次のようなものがあります。
- パラメーター検証エラー
- ホスト名または URI の参照時の名前解決の失敗
- ネットワーク接続の切断
- ソケットと HTTP クライアント API を使っているネットワーク接続の失敗
- ネットワーク サーバーまたはリモート エンドポイントのエラー
- その他のネットワーク エラー
ネットワークのエラーによる例外 (たとえば、接続の切断、接続エラー、HTTP サーバー エラーなど) は、いつでも発生する場合があります。 これらのエラーが起きると、例外がスローされます。例外がアプリによって処理されない場合、ランタイムによってアプリ全体が終了されることがあります。
非同期ネットワーク メソッドの多くは、呼び出す場合、例外を処理するようにコードを記述する必要があります。 例外の発生時に、場合によっては、問題を解決するためにネットワーク メソッドが再試行されることがあります。また、ネットワーク接続なしで、以前にキャッシュされたデータを使ってアプリを継続するように計画しなければならない場合もあります。
Windows ランタイム アプリは、一般に、1 つの例外をスローします。エラーについてよく理解し、適切な判断ができるように、例外ハンドラーは例外の原因についての詳しい情報を取得できます。
JavaScript は、この詳しい情報にアクセスするためのメソッドをサポートしています。例外は、Windows ランタイム アプリの HRESULT 値としてプロジェクションされます。Winerror.h インクルード ファイルには、ネットワーク エラーを含む有効な HRESULT 値の非常に大きなリストが格納されます。
Networking 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);
}
}
関連トピック
その他のリソース
リファレンス