Upgrade to Pro — share decks privately, control downloads, hide ads and more …

try-catchからrunCatchingに_移行した話.pdf

yuki anzai
August 24, 2019

 try-catchからrunCatchingに_移行した話.pdf

yuki anzai

August 24, 2019
Tweet

More Decks by yuki anzai

Other Decks in Programming

Transcript

  1. 自己紹介 安齋祐紀(あんざいゆうき) Twitter: @off2white 株式会社 ディー・エヌ・エー(DeNA) - 次世代タクシー配車サービス「 MOV」 -

    Androidアプリ開発担当 - プロジェクト管理とコーディングの割合 = 50:50 (気持ちは) 最近の悩み いまだに運営さんが採択時に 人を間違えていなかったのか心配
  2. 蘇る悪夢 try {
 response = apiRequest.execute() 
 dao.save(response.toEntity())
 
 }

    catch (e: IOException) {
 errorCode += “01”
 throw NetworkException(errorCode) 
 
 } catch (e: SQLException) {
 errorCode += “03”
 throw GeneralException(errorCode) 
 
 } catch (e: Throwable) {
 errorCode += “04”
 throw SystemException(errorCode) 
 
 }

  3. Rx では success と error 時の処理を 分けて記載できた repository.fetchData()
 
 .subscribeBy

    (
 onNext = { livedata.postValue(it)},
 
 onError = { Timber.e(it) }
 )
 実 行 系 正 常 系 異 常 系
  4. runCatching {
 apiRequest.execute()
 } 
 
 or 
 
 apiRequest.execute()


    .runCatching {
 dao.save(it.toEntity())
 } 
 こんな感じで書く
  5. val result = runCatching {
 apiRequest.execute()
 }
 
 if (result.isFailure)

    {
 Timber.e(
 result.exceptionOrNull()
 )
 return
 }
 処理結果を受け取って 返却してくれる
  6. runCatching {
 apiRequest.execute()
 }.onSuccess {
 dao.save(it.toEntity())
 }.onFailure {
 Timber.e(it)
 }


    成功処理と失敗処理を 分けて記載できる 実 行 系 正 常 系 異 常 系
  7. try {
 res = apiClient.execute()
 dao.save(res.toEntity())
 }
 catch (e: Exception)

    {
 Timber.e(e)
 } 
 正常パスと 例外処理で 別れている方が 好みの人もいる 正 常 パ ス 例 外 処 理 理由その1

  8. val a: Int? = 
 try { parseInt(input) } catch

    (e: Exception) 
 { null }
 Kotlin の try-catch は式 として書けるので それで十分説 理由その2

  9. val a: Int? = 
 try { parseInt(input) } catch

    (e: Exception) 
 { null }
 finally { ... }
 try-catch なら finally で 明示的に書ける (runCatching ではできない ) 理由その3

  10. fun function() : Int {
 runCatching {
 "5".toInt()
 }.onSuccess {


    return@function it
 }.onFailure {
 return@function 0
 }
 // ここにreturnが必要
 }
 a ‘return’ expression required in a function with a block body 理由その5

  11. runCatching {
 runFunction()
 }.onSuccess {
 dispatch(Action.Success)
 }.onFailure {
 dispatch(Action.Failure)
 }


    現状は return しない ところで そっと使っている ActionCreator の dispatch とか ViewModel の LiveData.postValue とか