https://kotlinlang.org logo
#coroutines
Title
# coroutines
f

Filip Wiesner

04/22/2021, 6:54 PM
Maybe a dumb question (EDIT: certainly dumb question 🙃) but how can I force app crash (Android) when child of
SupervisorJob
(viewModelScope) throws exception? My use case is that when debugging I want my app to crash whenever there is unhandled exception anywhere in my business logic but because
viewModelScope
is
SupervisorJob
, the coroutine is only getting cancelled. This behavior can be achieved by using
Dispatchers.Main
as context (presumably because it calls android
UncaughtExceptionHandler
) but I how can I achieve this when using
.Default
or
.IO
dispatchers?
👀 1
I tried adding my own
CoroutineExceptionHandler
and re-throwing the exception but without luck.
z

Zach Klippenstein (he/him) [MOD]

04/22/2021, 7:11 PM
You can kill the app by calling System.exit from your handler
f

Filip Wiesner

04/22/2021, 7:14 PM
Sigh...sometimes things are too obvious to think of. Thanks Zach, you saved my day 🤦‍♂️
z

Zach Klippenstein (he/him) [MOD]

04/22/2021, 7:20 PM
It’s easy to forget, you don’t see System much in Android 😅
l

louiscad

04/22/2021, 8:22 PM
I think the app should crash automatically if you're using
launch
(but not
async
which should be part of a child non supervisor scope.
☝️ 2
u

uli

04/23/2021, 6:49 AM
I think, even async will crash. But only when you await, which will rethrow.
f

Filip Wiesner

04/23/2021, 7:39 AM
I thought so too but it doesn't crash and I don't know what I'm doing wrong. There is async call but it's wrappen in
coroutineScope
and it only crashes when I'm using
Dispatchers.Main
. Any tips on where should I look to resolve this? My coroutine structure:
Copy code
viewModelScope.launch(<http://Dispatchers.IO|Dispatchers.IO>)
  withContext(Dispatchers.Default)
    coroutineScope
      async
      await - exception is thrown

OR

viewModelScope.launch(<http://Dispatchers.IO|Dispatchers.IO>)
  withContext(Dispatchers.Default)
    exception is thrown
Neither of those crash the app
By "using Dispatchers.Main" I mean that the initial launch is
viewModelScope.launch(Dispatchers.Main)
. The rest is the same
l

louiscad

04/23/2021, 7:44 AM
Are you 100% certain the app doesn't crash? On recent Android versions, the force close popup can not be shown and the process be silently restarted. An easy way to check it is attach a debugger and let the app crash. If the app actually crashes, the debugger wil be disconnected @Filip Wiesner
f

Filip Wiesner

04/23/2021, 7:52 AM
I can just continue using it and I don't see any closing animations. And yes, the debugger is still connected. And even if it would crash silently, why would there be a different behavior when using
.Main
dispatcher?
l

louiscad

04/23/2021, 8:04 AM
Does it happen with
lifecycleScope
in an Activity or only in
viewmModelScope
? Which AndroidX ViewModel KTX version are you using?
f

Filip Wiesner

04/23/2021, 8:06 AM
I am using version 2.2.0 and I'll test the
lifecycleScope
. Gimme a sec
Yeah, it's the same. I'll try to reproduce it in non-production project so I can share it
a

Alex Vasilkov

04/23/2021, 8:53 AM
This code crashes as expected for me:
Copy code
viewModelScope.launch(<http://Dispatchers.IO|Dispatchers.IO>) {
    withContext(Dispatchers.Default) {
        throw RuntimeException("TEST")
    }
}
Are you sure that the thrown exception is not
CancellationException
or its subclass? 🙂
f

Filip Wiesner

04/23/2021, 9:32 AM
Yeah, if I create new project and try the same structure, it does crash for me too 😞 I'll post here if I make any progress on this issue
l

louiscad

04/23/2021, 9:33 AM
Might be related to a crash reporting library or something that deals with
Thread.setUncaughtExceptionHandler
in your project.
🤔 1
f

Filip Wiesner

04/23/2021, 10:30 AM
It's definetly a project issue. I can call
Copy code
GlobalScope.launch {
    error("")
}
inside a ViewModel and it still does not crash...
Thanks for your help everyone 🙏 I'll probably spend my weekend debugging
@louiscad You were right, it was because of Crashlytics
l

louiscad

04/23/2021, 2:55 PM
Solely because of Crashlytics? Which version? I'm a bit surprised because I use Crashlytics and if I crash the app, well, it crashes anyway.
f

Filip Wiesner

04/23/2021, 3:08 PM
My colleague found the "bug" and apparently it's because we didn't have enabled Crashlytics for debug (only for alpha, beta and prod). So maybe some Crashlytics handler was consuming the exceptions but not propagating them to default handler (maybe it was crashing? I am not sure) I am still not 100% sure it's only because of Crashlytics becasue it's....weird but when my colleague enabled Crashlytics on debug, my unchanged code started crashing the app. But we are still investigating...
My other colleague just ran the app that wasn't crashing before and now it's crashing...
l

louiscad

04/23/2021, 4:26 PM
Same version of CrashLytics?
f

Filip Wiesner

04/23/2021, 6:04 PM
Same project - version 17.0.0
l

louiscad

04/23/2021, 8:28 PM
Looks like a random bug in that version of CrashLytics
4 Views