*/
use Wikimedia\Rdbms\DBConnectionError;
-use Wikimedia\Rdbms\DBError;
use Wikimedia\Rdbms\DBReadOnlyError;
use Wikimedia\Rdbms\DBExpectedError;
* @param Exception|Throwable|null $eNew New exception from attempting to show the first
*/
public static function output( $e, $mode, $eNew = null ) {
- global $wgMimeType;
+ global $wgMimeType, $wgShowExceptionDetails;
if ( defined( 'MW_API' ) ) {
// Unhandled API exception, we can't be sure that format printer is alive
self::printError( self::getText( $e ) );
} elseif ( $mode === self::AS_PRETTY ) {
self::statusHeader( 500 );
+ self::header( "Content-Type: $wgMimeType; charset=utf-8" );
if ( $e instanceof DBConnectionError ) {
self::reportOutageHTML( $e );
} else {
- self::header( "Content-Type: $wgMimeType; charset=utf-8" );
self::reportHTML( $e );
}
} else {
+ self::statusHeader( 500 );
+ self::header( "Content-Type: $wgMimeType; charset=utf-8" );
if ( $eNew ) {
$message = "MediaWiki internal error.\n\n";
- if ( self::showBackTrace( $e ) ) {
+ if ( $wgShowExceptionDetails ) {
$message .= 'Original exception: ' .
MWExceptionHandler::getLogMessage( $e ) .
"\nBacktrace:\n" . MWExceptionHandler::getRedactedTraceAsString( $e ) .
}
$message .= "\n";
} else {
- if ( self::showBackTrace( $e ) ) {
+ if ( $wgShowExceptionDetails ) {
$message = MWExceptionHandler::getLogMessage( $e ) .
"\nBacktrace:\n" .
MWExceptionHandler::getRedactedTraceAsString( $e ) . "\n";
* @return string Html to output
*/
public static function getHTML( $e ) {
- if ( self::showBackTrace( $e ) ) {
+ global $wgShowExceptionDetails;
+
+ if ( $wgShowExceptionDetails ) {
$html = "<div class=\"errorbox mw-content-ltr\"><p>" .
nl2br( htmlspecialchars( MWExceptionHandler::getLogMessage( $e ) ) ) .
'</p><p>Backtrace:</p><p>' .
* @return string Message with arguments replaced
*/
private static function msg( $key, $fallback /*[, params...] */ ) {
+ global $wgSitename;
$args = array_slice( func_get_args(), 2 );
try {
- return wfMessage( $key, $args )->text();
+ $res = wfMessage( $key, $args )->text();
} catch ( Exception $e ) {
- return wfMsgReplaceArgs( $fallback, $args );
+ $res = wfMsgReplaceArgs( $fallback, $args );
+ // If an exception happens inside message rendering,
+ // {{SITENAME}} sometimes won't be replaced.
+ $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
}
+ return $res;
}
/**
* @return string
*/
private static function getText( $e ) {
- if ( self::showBackTrace( $e ) ) {
+ global $wgShowExceptionDetails;
+
+ if ( $wgShowExceptionDetails ) {
return MWExceptionHandler::getLogMessage( $e ) .
"\nBacktrace:\n" .
MWExceptionHandler::getRedactedTraceAsString( $e ) . "\n";
}
}
- /**
- * @param Exception|Throwable $e
- * @return bool
- */
- private static function showBackTrace( $e ) {
- global $wgShowExceptionDetails, $wgShowDBErrorBacktrace;
-
- return (
- $wgShowExceptionDetails &&
- ( !( $e instanceof DBError ) || $wgShowDBErrorBacktrace )
- );
- }
-
/**
* @param Exception|Throwable $e
* @return string
*/
private static function getShowBacktraceError( $e ) {
- global $wgShowExceptionDetails, $wgShowDBErrorBacktrace;
- $vars = [];
- if ( !$wgShowExceptionDetails ) {
- $vars[] = '$wgShowExceptionDetails = true;';
- }
- if ( $e instanceof DBError && !$wgShowDBErrorBacktrace ) {
- $vars[] = '$wgShowDBErrorBacktrace = true;';
- }
- $vars = implode( ' and ', $vars );
- return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information.";
+ $var = '$wgShowExceptionDetails = true;';
+ return "Set $var at the bottom of LocalSettings.php to show detailed debugging information.";
}
/**
* @param Exception|Throwable $e
*/
private static function reportOutageHTML( $e ) {
- global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors;
+ global $wgShowExceptionDetails, $wgShowHostnames, $wgSitename;
$sorry = htmlspecialchars( self::msg(
'dberr-problems',
'Try waiting a few minutes and reloading.'
) );
- if ( $wgShowHostnames || $wgShowSQLErrors ) {
+ if ( $wgShowHostnames ) {
$info = str_replace(
'$1',
Html::element( 'span', [ 'dir' => 'ltr' ], $e->getMessage() ),
}
MessageCache::singleton()->disable(); // no DB access
+ $html = "<!DOCTYPE html>\n" .
+ '<html><head>' .
+ '<title>' .
+ htmlspecialchars( $wgSitename ) .
+ '</title>' .
+ '<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
+ "</head><body><h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
- $html = "<h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
-
- if ( $wgShowDBErrorBacktrace ) {
+ if ( $wgShowExceptionDetails ) {
$html .= '<p>Backtrace:</p><pre>' .
htmlspecialchars( $e->getTraceAsString() ) . '</pre>';
}
$html .= '<hr />';
$html .= self::googleSearchForm();
-
+ $html .= '</body></html>';
echo $html;
}