Created
January 12, 2018 15:58
-
-
Save mkoslacz/eb7d9345e6004fc39a5ba39f3f6324a4 to your computer and use it in GitHub Desktop.
RxJava2Debug causing StackOverflowError on too complex CompositeException
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@RunWith(AndroidJUnit4::class) | |
class RxJava2DebugStackOverflowTest { | |
@Test | |
fun errorReportedCorrectlyWithoutRxJava2Debug() { | |
RxJava2Debug.disableRxJava2AssemblyTracking() | |
var i = 1 | |
Observable.just(1) | |
.doOnNext { throw Exception("source exception") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.subscribe( | |
{ print("onNext: $it") }, | |
{ | |
// it has to be Log.e NOT printstacktrace! | |
Log.e("error", "", it.stripCompositeException()) // RxJava2Debug logging disabled, reports error correctly | |
}, | |
{ print("onComplete") }) | |
} | |
@Test | |
fun errorReportingCausesStackOverflowErrorWithRxJava2Debug() { | |
RxJava2Debug.enableRxJava2AssemblyTracking() | |
var i = 1 | |
Observable.just(1) | |
.doOnNext { throw Exception("source exception") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.doOnError { throw Exception("in chain exception ${i++}") } | |
.subscribe( | |
{ print("onNext: $it") }, | |
{ | |
// it has to be Log.e NOT printstacktrace! | |
Log.e("error", "",RxJava2Debug.getEnhancedStackTrace(it.stripCompositeException())) // RxJava2Debug logging enabled, process crashes on older apis (ie. 17 in my case) | |
}, | |
{ print("onComplete") }) | |
} | |
// workaround method I use to avoid stackOverflowError when reporting errors from some external components | |
private fun Throwable.stripCompositeException(): Throwable { | |
var exception = this | |
if ((this is CompositeException) && (this.exceptions.size > 5)) { | |
exception = CompositeException(this.exceptions.subList(0, 5)) | |
} | |
return exception | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment