Slide 1

Slide 1 text

©2020 Wantedly, Inc. The Pitfalls of Cancellation Presentation Subtitle 2020/12/22 Masatoshi Kubode https://unsplash.com/photos/J8sh37XZ8ww

Slide 2

Slide 2 text

©2020 Wantedly, Inc. ٱอग़խढ़ 8BOUFEMZ 8BOUFEMZ7JTJUͷ"OESPJEΞϓϦΛ։ൃ͍ͯ͠·͢ɻ ,PUMJO .BHJDUIF(BUIFSJOH UIJTUP4USJOH 5XJUUFS !TXJ[@BSE (JU)VC !LVCPEF

Slide 3

Slide 3 text

ϖʔδλΠτϧ ϖʔδαϒλΠτϧ ©2020 Wantedly, Inc. $PSPVUJOFTͰى͖ͨΫϥογϡͷ࿩

Slide 4

Slide 4 text

©2020 Wantedly, Inc. ͋Δ೔ͷΫϥογϡϨϙʔτ

Slide 5

Slide 5 text

ϖʔδλΠτϧ ϖʔδαϒλΠτϧ ©2020 Wantedly, Inc.

Slide 6

Slide 6 text

©2020 Wantedly, Inc. ֘౰ίʔυ class FetchDiscoverPostsUseCaseImpl( private val discoverRepository: DiscoverRepository, ) : FetchDiscoverPostsUseCase { override suspend operator fun invoke(sectionId: DiscoverSectionId) { try { return discoverRepository.fetchDiscoverPosts(sectionId) } catch (@Suppress("TooGenericExceptionCaught") e: Throwable) { throw FetchDiscoverProjectsUseCase.Error( "Failed to fetch discover posts for section: $sectionId”, e ) } } } ←ίϐϖͰTypoͯ͠Δ Repositoryͷྫ֎Λϥοϓͯ͠ Rethrowͯ͠Δ͚ͩͳͷʹ ͳͥ?

Slide 7

Slide 7 text

ϖʔδλΠτϧ ϖʔδαϒλΠτϧ ©2020 Wantedly, Inc. 4UBDL5SBDFΛΑ͘ݟΔ

Slide 8

Slide 8 text

©2020 Wantedly, Inc. ͋Δ೔ͷΫϥογϡϨϙʔτ JobCancellationException͕ݪҼ

Slide 9

Slide 9 text

ϖʔδλΠτϧ ϖʔδαϒλΠτϧ ©2020 Wantedly, Inc. +PC$BODFMMBUJPO&YDFQUJPOͱ͸

Slide 10

Slide 10 text

©2020 Wantedly, Inc. JobCancellationException https://atoulme.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.experimental/-job-cancellation-exception/index.html Job.cancel()͞Εͨͱ͖ʹ suspend͍ͯ͠Δؔ਺͔ΒThrow͞ΕΔ CoroutinesͷγεςϜతͳྫ֎

Slide 11

Slide 11 text

©2020 Wantedly, Inc. ֘౰ίʔυ class FetchDiscoverPostsUseCaseImpl( private val discoverRepository: DiscoverRepository, ) : FetchDiscoverPostsUseCase { override suspend operator fun invoke(sectionId: DiscoverSectionId) { try { return discoverRepository.fetchDiscoverPosts(sectionId) } catch (@Suppress("TooGenericExceptionCaught") e: Throwable) { throw FetchDiscoverProjectsUseCase.Error( "Failed to fetch discover posts for section: $sectionId”, e ) } } } ͭ·ΓɺCoroutinesͷγεςϜతͳྫ֎Λ ϥοϓͯ͠͠·͔ͬͨΒΫϥογϡͨ͠

Slide 12

Slide 12 text

©2020 Wantedly, Inc. JobCancellationExceptionৄղ ΋ͱ΋ͱJavaͷฒྻॲཧAPIͰ࢖ΘΕ͍ͯͨྫ֎

Slide 13

Slide 13 text

©2020 Wantedly, Inc. Javaͷੈք java.util.concurrent.Future#get() try { future.get(); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } CancellationException͸RuntimeException ͳͷͰ໌ࣔతͳcatchෆཁ CancellationΛcatchͪ͠Ό͏͜ͱ͕ى͖ͮΒ͍

Slide 14

Slide 14 text

©2020 Wantedly, Inc. Kotlinͷੈք Kotlinʹ͸ݕࠪྫ֎͕ͳ͍ catch(Throwable)͕ͪ͠ CoroutinesͰ͸ࠓճͷΑ͏ͳ໰୊ʹܨ͕Γ΍͍͢ cancel()ͯ͠໰୊ͳ͍͔ͱ͍͏ςετ͸;ͭ͏ॻ͔ͳ͍͠ɺ ݱঢ়͸ϓϩάϥϚ͕ؾΛ͚ͭΔ͔͠ͳ͍ʁ

Slide 15

Slide 15 text

©2020 Wantedly, Inc. Ͳ͏͢΂͖͔ launch { try { codeThatCanThrowExceptions() // // } catch (e: Throwable) { // } catch (e: Exception) { // } catch (e: RuntimeException) { // } catch (e: IllegalStateException) { // } catch (e: CancellationException) { } catch (e: SpecificException) { // throw MyException(e) } } // OR launch { try { codeThatCanThrowExceptions() } catch (e: Throwable) { throw e as? CancellationException ?: MyException(e) } }

Slide 16

Slide 16 text

©2020 Wantedly, Inc. w ,PUMJOʹ͸ݕࠪྫ֎͕ͳ͍ͷͰࡶʹ͕͕ͪͩ͠ɺ $PSPVUJOFTͰ5PP(FOFSJDͳDBUDI͸ةݥ w DBUDI͔ͨͬͨ͠Β$BODFMMBUJPO͸SFUISPX w ΋͘͠͸$PSPVUJOF&YDFQUJPO)BOEMFSΛ࢖͏ w -JOU͸ແࢹ͠ͳ͍ ·ͱΊ

Slide 17

Slide 17 text

ϖʔδλΠτϧ ϖʔδαϒλΠτϧ ©2020 Wantedly, Inc.