【Unity】UnityWebRequestのエラーハンドリングをちゃんとやる

UnityWebRequestのエラーハンドリングをしっかり行う方法をまとめます。

Unity2019.1

二つのエラーフラ

マニュアルを参照すると、UnityWebRequestには二つのエラーフラグがあることがわかります。

一つ目はisHttpErrorです。
これはHTTPステータスコードがエラーを示している場合(400以上の時)に発生します。

docs.unity3d.com

もう一つはisNetworkingErrorです。
これはUnityWebRequestのシステムエラーが発生したことを示します。
具体的には、DNSを解決できない、リダイレクトエラー、タイムアウトなどがこれに当たります。

docs.unity3d.com

ソースコード

上記の仕様を踏まえると、エラーは下記のようにすれば処理できそうです。

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に入ってくる文字列が掲載されている珍しい例です。

docs.unity3d.com

追記: 2021/1/28

Unity2020.2でisNetworkErrorとisHttpError が非推奨になりエラーハンドリングの方法が変わったようです。

baba-s.hatenablog.com

だいぶ微妙でしたもんね。

参考

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com