mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 08:42:41 +01:00
08126d3904
Summary: Fixes T6692. Addresses two main issues: - The write guard would sometimes not get disposed of on exception pathways, generating an unnecessary secondary error which was just a symptom of the original root error. - This was generally confusing and reduced the quality of reports we received because users would report the symptomatic error sometimes instead of the real error. - Instead, reflow the handling so that we always dispose of the write guard if we create one. - If we missed the Controller-level error page generation (normally, a nice page with full CSS, etc), we'd jump straight to Startup-level error page generation (very basic plain text). - A large class of errors occur too early or too late to be handled by Controller-level pages, but many of these errors are not fundamental, and the plain text page is excessively severe. - Provide a mid-level simple HTML error page for errors which can't get full CSS, but also aren't so fundamental that we have no recourse but plain text. Test Plan: Mid-level errors now produce an intentional-looking error page: {F259885} Verified that setup errors still render properly. @chad, feel free to tweak the exception page -- I just did a rough pass on it. Like the setup error stuff, it doesn't have Celerity, so we can't use `{$colors}` and no other CSS will be loaded. Reviewers: chad, btrahan Reviewed By: btrahan Subscribers: epriestley, chad Maniphest Tasks: T6692 Differential Revision: https://secure.phabricator.com/D11126
37 lines
1 KiB
PHP
37 lines
1 KiB
PHP
<?php
|
|
|
|
$phabricator_root = dirname(dirname(__FILE__));
|
|
require_once $phabricator_root.'/support/PhabricatorStartup.php';
|
|
|
|
// If the preamble script exists, load it.
|
|
$preamble_path = $phabricator_root.'/support/preamble.php';
|
|
if (file_exists($preamble_path)) {
|
|
require_once $preamble_path;
|
|
}
|
|
|
|
PhabricatorStartup::didStartup();
|
|
|
|
try {
|
|
PhabricatorStartup::loadCoreLibraries();
|
|
$sink = new AphrontPHPHTTPSink();
|
|
|
|
try {
|
|
AphrontApplicationConfiguration::runHTTPRequest($sink);
|
|
} catch (Exception $ex) {
|
|
try {
|
|
$response = new AphrontUnhandledExceptionResponse();
|
|
$response->setException($ex);
|
|
|
|
PhabricatorStartup::endOutputCapture();
|
|
$sink->writeResponse($response);
|
|
} catch (Exception $response_exception) {
|
|
// If we hit a rendering exception, ignore it and throw the original
|
|
// exception. It is generally more interesting and more likely to be
|
|
// the root cause.
|
|
throw $ex;
|
|
}
|
|
}
|
|
|
|
} catch (Exception $ex) {
|
|
PhabricatorStartup::didEncounterFatalException('Core Exception', $ex, false);
|
|
}
|