LoginSignup
1
3

More than 5 years have passed since last update.

Android で例外受け取った時にエラーコード取得する方法がどこにも見つからなかったので見つけた

Last updated at Posted at 2017-08-30

経緯

Swift やら ObjC なら
catch した NSError の中にエラーコードが含まれている

let e: NSError = NSError(domain: "unko", code: 931, userInfo: nil)
print(e.code) // <- 931

翻って Android Java で HttpURLConnection で例外を受け取った時に、こういうメッセージが表示されたことがあった
failed to connect to /**.*.***.** (port *****): connect failed: ECONNREFUSED (Connection refused)`
この ECONNREFUSED ってやつが Excption の中にエラーコード持ってないかと思って探したけど Swift みたいに getCode() とかそういうのもなく、
えー、 getLocalizedMessage() で文字列から種別分けするのか? そんなバカな
という感じで困ったのに検索かけてもなんも情報が出てこないのでちょっとハマった

見つけた

URL url = new URL("http://unko.com");
HttpURLConnection connection = null;
try {
    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    connection.connect();  // 例外くるとこ
    Log.d("unko", "" + connection.getResponseCode());
    Log.d("unko", "" + connection.getContentType());
} catch (Exception e) {
    Log.w("unko", "" + ((ErrnoException) e.getCause()).errno);
} finally {
    if (connection != null) {
        connection.disconnect();
    }
}

この部分でコードが取れた

((ErrnoException) e.getCause()).errno // == 111

この 111 ってのは Linux System Errors からきてるみたい
ETIMEDOUT とかもメッセージとったことあったし間違いないでしょ・・・

Errors: Linux System Errors
http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html

ちなみにそれらは定数が定義されてた
OsConstants.ECONNREFUSED

こうして私はエラーコード取得がわかりました

はい

まとめ

  • コードとるだけなのにめんどくさい
  • ちゃんとは調べてないので他の方法があったら、まじかーってなる
  • Java は糞
1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3