We’re having some difficulties with thrown exceptions from the shared code that we handle in the iOS side. We annotate suspending functions in our domain/data layer with
Throws(Throwable:class)
and we log these errors to Crashlytics. Problem is, the error we get (when we cast it as an NSError) has a user info dictionary with a KotlinException entry, and it has a code of 0 and a domain of “KotlinException”. This causes all errors logged to crashlytics to be grouped under the same bucket. The Kotlin throwable has a message which looks something like this (this is formatted for readability, it’s still a string)
Exception in http request:
Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline."
UserInfo={
_kCFStreamErrorCodeKey=50,
NSUnderlyingError=0x28035a940 {
Error Domain=kCFErrorDomainCFNetwork Code=-1009 "(null)"
UserInfo={
_NSURLErrorNWPathKey=unsatisfied (No network route),
_kCFStreamErrorCodeKey=50,
_kCFStreamErrorDomainKey=1
}
},
_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <595E528B-8F59-4D85-88EE-DD084FC43CE7>.<1>,
_NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <595E528B-8F59-4D85-88EE-DD084FC43CE7>.<1>"
),
NSLocalizedDescription=The Internet connection appears to be offline.,
NSErrorFailingURLStringKey=SOME URL,
NSErrorFailingURLKey=SOME URL,
_kCFStreamErrorDomainKey=1
}
I
could try and parse this string, extract regex matches etc, but I was wondering if there is a better way. It seems like Kotlin packs all of the interesting stuff and concatenates their string representations and just stuffs it into the userInfo entry. I would very much have liked to get the actual error instance.
How do people handle this?