はじめに
アプリを制作していると強制アップデートやメンテナンス中表示など、高確率で実装しますよね。
上記機能を実装する際、特定のエラーコードがサーバーから返ってきた場合に共通したExceptionを該当箇所全てでハンドリングしたい場合があるかと思います。
今回は上記に関しての実装方法を備忘録的にまとめておこうと思います。
エラーハンドリング実装方法
まず実装をまとめるにあたり、okhttp、retrofitを使用していること前提で話を進めたいと思います。
今回解説するエラーハンドリングは独自のInterceptorを作成し、okhttpの設定に組み込むことで実装可能です。
class ErrorHandlingInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val response = chain.proceed(request)
when (response.code) {
HttpURLConnection.HTTP_BAD_REQUEST -> throw ExampleException()
}
return response
}
}
以上がエラーハンドリングを行うInterceptor内の処理になります。
intercept内でサーバーから返却されたコードを参照し、特定のコードが返却された場合は任意のExceptionに変換して返すようにします。
こうすることで、APIを叩いているすべての箇所で同じExceptionを参照しハンドリングすることが可能になります。
また、上記実装に際し一点注意点として、ここで返却させられるのはIOExceptionを親にもつExceptionのみになります。
上記以外を親にすると内部でExceptionを処理できずクラッシュするのでご注意ください。
val client = OkHttpClient.Builder().apply {
addInterceptor(ErrorHandlingInterceptor())
}
Interceptor側の実装ができればあとは上記のように、OkHttpClientに対して先ほど作成したInterceptorをaddしてあげるだけになります。
これで実装は以上になります。
さいごに
エラーハンドリングも中々設計が難しい要素の一つですよね。
プロジェクト立ち上げ当初にこの辺りをしっかり考え込んで作らないと後で辛い思いをしかねないので、丁寧に実装しておきたいところですね。