/** * Constructor - to be used by core code only. * @param string $method The method to call * @param array $arguments Arguments to pass to the method being called * @return string */ public function __call($method, $arguments) { global $OUTPUT, $PAGE; $recursing = false; if ($method == 'notification') { // Catch infinite recursion caused by debugging output during print_header. $backtrace = debug_backtrace(); array_shift($backtrace); array_shift($backtrace); $recursing = is_early_init($backtrace); } $earlymethods = array('fatal_error' => 'early_error', 'notification' => 'early_notification'); // If lib/outputlib.php has been loaded, call it. if (!empty($PAGE) && !$recursing) { if (array_key_exists($method, $earlymethods)) { //prevent PAGE->context warnings - exceptions might appear before we set any context $PAGE->set_context(null); } $PAGE->initialise_theme_and_output(); return call_user_func_array(array($OUTPUT, $method), $arguments); } $this->initialising = true; // Too soon to initialise $OUTPUT, provide a couple of key methods. if (array_key_exists($method, $earlymethods)) { return call_user_func_array(array('bootstrap_renderer', $earlymethods[$method]), $arguments); } throw new coding_exception('Attempt to start output before enough information is known to initialise the theme.'); }
function cobalt_exception_handler($ex) { global $CFG, $DB, $OUTPUT, $USER, $FULLME, $SESSION, $PAGE; // detect active db transactions, rollback and log as error abort_all_db_transactions(); $info = get_cobaltexception_info($ex); if (($ex instanceof required_capability_exception) && !CLI_SCRIPT && !AJAX_SCRIPT && !empty($CFG->autologinguests) && !empty($USER->autologinguest)) { $SESSION->wantsurl = qualified_me(); redirect(get_login_url()); } if (debugging('', DEBUG_MINIMAL)) { $logerrmsg = "Default exception handler: " . $info->message . ' Debug: ' . $info->debuginfo . "\n" . format_backtrace($info->backtrace, true); error_log($logerrmsg); } if (is_early_init($info->backtrace)) { echo bootstrap_renderer::early_error($info->message, $info->link, $info->backtrace, $info->debuginfo, $info->errorcode); } else { try { if ($DB) { // If you enable db debugging and exception is thrown, the print footer prints a lot of rubbish $DB->set_debug(0); } cobaltexception_format($ex); } catch (Exception $out_ex) { // default exception handler MUST not throw any exceptions!! // the problem here is we do not know if page already started or not, we only know that somebody messed up in outputlib or theme // so we just print at least something instead of "Exception thrown without a stack frame in Unknown on line 0":-( if (CLI_SCRIPT or AJAX_SCRIPT) { // just ignore the error and send something back using the safest method echo bootstrap_renderer::early_error($info->message, $info->link, $info->backtrace, $info->debuginfo, $info->errorcode); } else { echo bootstrap_renderer::early_error_content($info->message, $info->link, $info->backtrace, $info->debuginfo); $outinfo = get_exception_info($out_ex); echo bootstrap_renderer::early_error_content($outinfo->message, $outinfo->link, $outinfo->backtrace, $outinfo->debuginfo); } } } exit(1); // General error code }