/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . squareup . workflow . legacy . rx 2 Ċ Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* ĠTemp or arily Ġoverrides Ġthe Ċ Ġ* Ġ[ default Ġun caught Ġexception Ġhandler ][ Thread . default Un caught ExceptionHandler ] Ġwhile Ġrunning Ġ[ block ], Ċ Ġ* Ġand Ġthen Ġafter Ġ` block ` Ġreturns , Ġre throws Ġany Ġexceptions Ġthat Ġwere Ġreported Ġto Ġthe Ġun caught Ġhandler . Ċ Ġ* Ċ Ġ* ĠThis Ġallows Ġthe Ġnormal ĠJ Unit Ġexception Ġassertion Ġmechanisms Ġto Ġwork Ġwith Ġun caught Ġexceptions . Ċ Ġ*/ Ċ fun Ġre throw ing Un caught Exceptions ( block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠ Ġval Ġold Handler Ġ= ĠThread . getDefault Un caught ExceptionHandler () ĊĠ Ġval Ġun caught Exception Ġ= ĠAtomic Reference < Throwable ? >( null ) ĊĠ ĠThread . setDefault Un caught ExceptionHandler Ġ{ Ġ_, Ġe Ġ-> ĊĠĠĠ Ġ// ĠIf Ġthis Ġis Ġthe Ġfirst Ġun caught Ġexception , Ġtry Ġto Ġset Ġit Ġas Ġthe Ġinitial Ġexception . ĊĠĠĠ Ġif Ġ(! unc a ught Exception . compare AndSet ( null , Ġe )) Ġ{ ĊĠĠĠĠĠ Ġ// ĠIf Ġanother Ġthread Ġbeat Ġus Ġto Ġit , Ġadd Ġthis Ġexception Ġto Ġthe Ġsupp ressed Ġlist . ĊĠĠĠĠĠ Ġ// Ġadd Sup pressed Ġis Ġthread - safe Ġso Ġwe Ġdon 't Ġneed Ġto Ġdo Ġany Ġexplicit Ġsynchronization . ĊĠĠĠĠĠ Ġun caught Exception . get () !!. add Sup pressed ( e ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġvar Ġcaught Exception : ĠThrowable ? Ġ= Ġnull ĊĊĠ Ġtry Ġ{ ĊĠĠĠ Ġblock () ĊĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġcan 't Ġjust Ġre - throw Ġthis Ġexception Ġimmediately , Ġbecause Ġwe Ġneed Ġto Ġfirst Ġsee Ġif Ġany Ġother ĊĠĠĠ Ġ// Ġun caught Ġexceptions Ġwere Ġreported Ġso Ġwe Ġcan Ġadd Ġthem Ġto Ġthis Ġone Ġas Ġsupp ressed Ġexceptions . ĊĠĠĠ Ġcaught Exception Ġ= Ġe ĊĠ Ġ} Ġfinally Ġ{ ĊĠĠĠ ĠThread . setDefault Un caught ExceptionHandler ( old Handler ) ĊĊĠĠĠ Ġval Ġun caught Ġ= Ġun caught Exception . get () ĊĠĠĠ Ġif Ġ( caught Exception Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠUn caught Ġexceptions Ġwere Ġreported , ĠAND Ġthe Ġblock Ġthrew Ġits Ġown Ġexception . ĠThe Ġun caught Ġones ĊĠĠĠĠĠ Ġ// Ġare Ġ" sup pressed " Ġby Ġthe Ġblock 's Ġexception . ĊĠĠĠĠĠ Ġif Ġ( unc a ught Ġ!= Ġnull ) Ġcaught Exception . add Sup pressed ( unc a ught ) ĊĠĠĠĠĠ Ġthrow Ġcaught Exception ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThe Ġblock Ġcompleted Ġsuccessfully , Ġso Ġif Ġthere Ġwere Ġany Ġun caught Ġexceptions Ġwe Ġneed Ġto Ġthrow ĊĠĠĠ Ġ// Ġthem Ġnow . ĊĠĠĠ Ġif Ġ( unc a ught Ġ!= Ġnull ) Ġthrow Ġun caught ĊĠ Ġ} Ċ } Ċ