- Web Engineer
- アウトバウンド営業
- Webエンジニア(経験者)
- Other occupations (18)
- Development
- Business
Koltin Coroutines withContextを使っているとStackTraceを用いた不具合調査が辛いのをどうにかしたい【株式会社ライトコード】
はじめに
Androidの非同期処理でKoltin Coroutinesを用いた実装を数年続けてきたことで
非同期処理を最適化するために
withContextを積極的に使うことを意識して実装するようになりました。
withContextによるスレッドの切り替えは
オーバーヘッドも少なく、気軽に使うことができるのが魅力の一つです。
しかし、withContextを積極的に使った実装をするようになったことで
StackTraceを用いた不具合調査がしづらくなってしまいました。
「不具合調査が辛い」とはどういうことか
端的に言うと。
withContextを使うと「StackTraceが破壊され処理の呼び出し元がわからなくなる」
という問題が辛いです。
例を挙げましょう。
// 適当なRpository
class HogeRepository(
private val dispatcherIO: CoroutineDispatcher = Dispatchers.IO
) {
suspend fun getHoge(): String = withContext(dispatcherIO) {
throw RuntimeException("適当な例外")
}
}
これをViewModelで利用したとしましょう。
// 適当なViewModelから呼び出す
class MainViewModel(
private val repository: HogeRepository = HogeRepository()
) : ViewModel() {
fun onClickButton() {
viewModelScope.launch {
// 先のRepositoryのメソッド呼び出す
repository.getHoge()
}
}
}
この状態でMainViewModel.onClickButton()
を実行して、アプリをクラッシュさせます。
出力されたスタックトレースを見てみましょう。
はい。(行数は例とズレているので気にしないでください)
「HogeRepository.getHoge()
内部(性格にはwithContext内部)で例外が発生した」
という情報しかわかりません。
「MainViewModel.onClickButton()
から呼ばれた」
という情報が読み取れません。
これでは、不具合調査が難しくなってしまう可能性があります。
困ること
まあ、当たり前といえば当たり前の話ですね。
suspend関数のJVMレベルでの挙動では
「一時的に抜けてあとから再開する」という挙動をしており
物理的なコールスタックが分断されているので、
スタックトレースがこうなってしまうのは仕方ないことです。
いやー
呼び出し箇所が1箇所なら、これでもあまり困りませんが。
以下のように、同じ処理を複数箇所から呼び出されている場合は致命的です。
// 複数箇所から呼び出すケース
class MainViewModel(
private val repository: HogeRepository = HogeRepository()
) : ViewModel() {
fun onClickButton1() {
viewModelScope.launch {
repository.getHoge() // ここでクラッシュ?
}
}
fun onClickButton2() {
viewModelScope.launch {
repository.getHoge() // それとも、こっちでクラッシュ?
}
}
}
「特定の呼び出し元からのみクラッシュする」のようなケースで
どこから呼ばれてクラッシュしたのかわからないと辛いですね。
困った困った。
ではどうするか?
正直、ベストな回答を持っていません。
今のところは、try-catchでcatchした例外をログ出力するのがよいのでは?と思っています。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/52128
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
Wantedly:https://www.wantedly.com/companies/rightcode
コーポレート:https://rightcode.co.jp/