From: Aaron Schulz Date: Tue, 31 Mar 2015 22:41:26 +0000 (-0700) Subject: Some cleanups to MWExceptionHandler::handleException X-Git-Tag: 1.31.0-rc.0~11827^2 X-Git-Url: https://git.cyclocoop.org/admin/?a=commitdiff_plain;h=50b7a49e66180e06ab510e4f6a365177ed2b8990;p=lhc%2Fweb%2Fwiklou.git Some cleanups to MWExceptionHandler::handleException * Do not bother with profiling data, which is just another thing that can go wrong. * Catch DB rollback errors to avoid getting stuck in report() loops during network partitions. Change-Id: I92293b2261c48cf49625ea14a51987e5619ab8d4 --- diff --git a/includes/exception/MWExceptionHandler.php b/includes/exception/MWExceptionHandler.php index 7110361066..0582b24f83 100644 --- a/includes/exception/MWExceptionHandler.php +++ b/includes/exception/MWExceptionHandler.php @@ -150,22 +150,24 @@ class MWExceptionHandler { * @since 1.25 * @param Exception $e */ - public static function handleException( $e ) { - global $wgFullyInitialised; + public static function handleException( Exception $e ) { + try { + // Rollback DBs to avoid transaction notices. This may fail + // to rollback some DB due to connection issues or exceptions. + // However, any sane DB driver will rollback implicitly anyway. + self::rollbackMasterChangesAndLog( $e ); + } catch ( DBError $e2 ) { + // If the DB is unreacheable, rollback() will throw an error + // and the error report() method might need messages from the DB, + // which would result in an exception loop. PHP may escalate such + // errors to "Exception thrown without a stack frame" fatals, but + // it's better to be explicit here. + self::logException( $e2 ); + } - self::rollbackMasterChangesAndLog( $e ); self::logException( $e ); self::report( $e ); - // Final cleanup - if ( $wgFullyInitialised ) { - try { - // uses $wgRequest, hence the $wgFullyInitialised condition - wfLogProfilingData(); - } catch ( Exception $e ) { - } - } - // Exit value should be nonzero for the benefit of shell jobs exit( 1 ); }