経緯
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 は糞