Changeset View
Changeset View
Standalone View
Standalone View
src/aphront/handler/PhabricatorDefaultRequestExceptionHandler.php
- This file was added.
| <?php | |||||
| final class PhabricatorDefaultRequestExceptionHandler | |||||
| extends PhabricatorRequestExceptionHandler { | |||||
| public function getRequestExceptionHandlerPriority() { | |||||
| return 900000; | |||||
| } | |||||
| public function getRequestExceptionHandlerDescription() { | |||||
| return pht('Handles all other exceptions.'); | |||||
| } | |||||
| public function canHandleRequestException( | |||||
| AphrontRequest $request, | |||||
| Exception $ex) { | |||||
| if (!$this->isPhabricatorSite($request)) { | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| public function handleRequestException( | |||||
| AphrontRequest $request, | |||||
| Exception $ex) { | |||||
| $viewer = $this->getViewer($request); | |||||
| // Always log the unhandled exception. | |||||
| phlog($ex); | |||||
| $class = get_class($ex); | |||||
| $message = $ex->getMessage(); | |||||
| if ($ex instanceof AphrontSchemaQueryException) { | |||||
| $message .= "\n\n".pht( | |||||
| "NOTE: This usually indicates that the MySQL schema has not been ". | |||||
| "properly upgraded. Run '%s' to ensure your schema is up to date.", | |||||
| 'bin/storage upgrade'); | |||||
| } | |||||
| if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode')) { | |||||
| $trace = id(new AphrontStackTraceView()) | |||||
| ->setUser($viewer) | |||||
| ->setTrace($ex->getTrace()); | |||||
| } else { | |||||
| $trace = null; | |||||
| } | |||||
| $content = phutil_tag( | |||||
| 'div', | |||||
| array('class' => 'aphront-unhandled-exception'), | |||||
| array( | |||||
| phutil_tag('div', array('class' => 'exception-message'), $message), | |||||
| $trace, | |||||
| )); | |||||
| $dialog = new AphrontDialogView(); | |||||
| $dialog | |||||
| ->setTitle(pht('Unhandled Exception ("%s")', $class)) | |||||
| ->setClass('aphront-exception-dialog') | |||||
| ->setUser($viewer) | |||||
| ->appendChild($content); | |||||
| if ($request->isAjax()) { | |||||
| $dialog->addCancelButton('/', pht('Close')); | |||||
| } | |||||
| return id(new AphrontDialogResponse()) | |||||
| ->setDialog($dialog) | |||||
| ->setHTTPResponseCode(500); | |||||
| } | |||||
| } | |||||