/** * Handle uncaught exceptions. * * @param \Exception $exception An uncaught exception. */ public static function exception_handler(\Exception $exception) { global $CFG, $USR; $errcode = $exception->getCode(); $errmsg = $exception->getMessage(); $errcodelabel = $exception instanceof \pdyn\base\Exception ? $exception->get_string_from_code($errcode) : static::getinternalerrorlabel($errcode); if (\pdyn\base\Utils::is_cli_env() === true) { echo 'APP ERROR: ' . $errcodelabel . ': ' . $errmsg . "\n"; } else { // Atlas exceptions' error codes are HTTP status codes, so send one. if ($exception instanceof \pdyn\base\Exception && !empty($errcode) && !headers_sent()) { \pdyn\httputils\Utils::send_status_code($errcode, '', false); } else { \pdyn\httputils\Utils::send_status_code(500, '', false); } $LOG = new \pdyn\log\Logger($CFG->log_general); $LOG->error($errcodelabel . ': ' . $exception); if (isset($_GET['ajax'])) { header('Content-type: application/json'); echo json_encode(['result' => 'fail', 'msg' => $errcodelabel . ': ' . $errmsg]); } else { $debugmode = !empty($CFG) && (bool) $CFG->get('core', 'debugmode', false) === true ? true : false; $isadmin = !empty($USR) && $USR->is_admin === true ? true : false; $backtrace = $isadmin === true || $debugmode === true ? static::format_backtrace($exception->getTrace()) : null; static::write_error_html($errcodelabel, $errmsg, $errcode, $backtrace); } } die; }