UnityWebRequestのエラーハンドリングをしっかり行う方法をまとめます。
- 二つのエラーフラグ
- ソースコード
- UnityWebRequest.error文字列に何が入ってくるか
- UnityWebRequest.errorを考慮したエラーハンドリング
- 追記: 2021/1/28
- 参考
Unity2019.1
二つのエラーフラグ
マニュアルを参照すると、UnityWebRequestには二つのエラーフラグがあることがわかります。
一つ目はisHttpError
です。
これはHTTPステータスコードがエラーを示している場合(400以上の時)に発生します。
もう一つはisNetworkingError
です。
これはUnityWebRequestのシステムエラーが発生したことを示します。
具体的には、DNSを解決できない、リダイレクトエラー、タイムアウトなどがこれに当たります。
ソースコード
上記の仕様を踏まえると、エラーは下記のようにすれば処理できそうです。
public IEnumerator DownloadRoutine(string url) { var request = UnityWebRequest.Get(url); yield return request.SendWebRequest(); if(request.isHttpError) { // レスポンスコードを見て処理 Debug.Log($"[Error]Response Code : {request.responseCode}"); } else if (request.isNetworkError) { // エラーメッセージを見て処理 Debug.Log($"[Error]Message : {request.error}"); } else{ // 成功したときの処理 Debug.Log($"[Success]"); } }
UnityWebRequest.error文字列に何が入ってくるか
さて上述の通り、isNetworkingError
がtrueの場合にはUnityWebRequest.error
にエラー文字列が入ってきます。
が、マニュアルの情報が(例のごとく)少なく、これに具体的にどんな文字列が入ってくるのかわかりません。
CsReferenceを見てみてもわかりません。
https://github.com/jamesjlinden/unity-decompiled/blob/96fb16e2eb6fff1acf3d4e25fa713defb3d17999/UnityEngine/UnityEngine/Experimental/Networking/UnityWebRequest.cs#L136github.com
細かくエラーハンドリングを行いたい場合には、実際にエラーを起こしてerror文字列を出力するしかなさそうです。。
UnityWebRequest.errorを考慮したエラーハンドリング
上記のようにしてerrorに入ってくる文字列がわかれば、もっと細かいエラーハンドリングができます。
例えばタイムアウト時だけの処理を記述したい場合には以下のようにします。
public IEnumerator DownloadRoutine(string url) { var request = UnityWebRequest.Get(url); // タイムアウト設定 request.timeout = 10; yield return request.SendWebRequest(); if(request.isHttpError) { Debug.Log($"[Error]Response Code : {request.responseCode}"); } else if (request.isNetworkError) { if (request.error == "Request timeout") { // タイムアウト時の処理 Debug.Log($"[Error]TimeOut"); } else { Debug.Log($"[Error]Message : {request.error}"); } } else{ // 成功したときの処理 Debug.Log($"[Success]"); } }
ちなみにタイムアウトはマニュアルにerrorに入ってくる文字列が掲載されている珍しい例です。
追記: 2021/1/28
Unity2020.2でisNetworkErrorとisHttpError が非推奨になりエラーハンドリングの方法が変わったようです。
だいぶ微妙でしたもんね。