Last active
July 1, 2017 12:54
-
-
Save mkoslacz/d8fc4db9ff30f25259e65ea8c855e0f1 to your computer and use it in GitHub Desktop.
Traceur 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 TraceurStackOverflowTest { | |
@Test | |
fun errorReportedCorrectlyWithoutTraceur() { | |
Traceur.disableLogging() | |
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()) // tracuer logging disabled, reports error correctly | |
}, | |
{ print("onComplete") }) | |
} | |
@Test | |
fun errorReportingCausesStackOverflowErrorWithTraceur() { | |
Traceur.enableLogging() | |
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()) // tracuer 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