* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ abstract class FrameworkException extends ReflectionException { /** * Array for the backtrace */ private $backTrace = array(); /** * Extra data */ private $extraData = ''; /** * The super constructor for all exceptions * * @param $message The non-optional message for the exception * @param $code An optional code for better debugging * @return void */ public function __construct ($message, $code = 0) { // Make sure everything is assigned properly parent::__construct($message, $code); // Extract backtrace $this->saveBackTrace(); // Cast all data $message = (string) $message; $code = (int) $code; // In emergency exit? if (defined('EMERGENCY_EXIT_CALLED')) { // Output message printf("[%s:] Message: %s, Backtrace:
%s
", $this->__toString(), $message, $this->getPrintableBackTrace() ); // End here exit(); } // END - if // Should we log exceptions? (bad implementation) if (defined('LOG_EXCEPTIONS')) { // Log the error error_log(sprintf("[%s:] %s (%s)", $this->__toString(), $message, $this->getHexCode() )); } // END - if } /** * Save the current backtrace * * @return void */ private final function saveBackTrace () { // Get full backtrace $this->backTrace = debug_backtrace(); // Remove this call $dummy = array_shift($this->backTrace); // resort the array ksort($this->backTrace); } /** * Get saved backtrace * * @return $backTrace The full backtrace in an array */ public final function getBackTrace () { return $this->backTrace; } /** * Getter for printable backtrace * * @return $backTrace Backtrace for web pages */ public final function getPrintableBackTrace () { // Get the backtrace $dbgTrace = $this->getBackTrace(); // Taken from de.php.net user comments $dbgMsg = "
\nDebug backtrace begin:
\n"; foreach ($dbgTrace as $dbgIndex => $dbgInfo) { // No info by default $info = 'NULL'; // Are there arguments? if ((isset($dbgInfo['args'])) && (is_array($dbgInfo['args'])) && (isset($dbgInfo['args'][0]))) { //* DEBUG: */ echo $dbgIndex.":
".htmlentities(print_r($dbgInfo['args'], true))."
"; $info = ''; foreach ($dbgInfo['args'] as $debug) { // Add only non-array elements if (!is_array($debug)) { $info .= $debug . ', '; } // END - if } // END - foreach // Remove last chars (commata, space) $info = substr($info, 0, -2); } // END - if // Prepare argument infos $info = '' . $info . ''; // File detection $file = 'Unknown file'; if (isset($dbgInfo['file'])) { $file = basename($dbgInfo['file']); } // END - if // Line detection $line = 'Unknown line'; if (isset($dbgInfo['line'])) { $line = 'line ' . $dbgInfo['line']; } // END - if // The message $dbgMsg .= "\t at ".$dbgIndex." ".$file." (".$line.") -> ".$dbgInfo['function'].'('.$info.")
\n"; } // END - if // Add end-message $dbgMsg .= "Debug backtrace end
\n"; // Return full debug message return $dbgMsg; } /** * Returns the name of the thrown exception * * @return $toString The name of the thrown exception */ public function __toString() { return get_class($this); } /** * Getter for hex-decimal code * * @param $code Integer code to encode in hex * @return $hexCode The exception code in hex-decimal format */ public final function getHexCode ($code = null) { // Get the decimal code if (is_null($code)) $code = $this->getCode(); // Format it to hex-decimal, 0x as prefix and 3 chars $hexCode = sprintf("0x%03s", dechex($code)); // Return it return $hexCode; } /** * Setter for extra data * * @param $extraData Extra data to store * @return void */ protected final function setExtraData ($extraData) { $this->extraData = $extraData; } /** * Getter for extra data * * @return $extraData Extra data to store */ public final function getExtraData () { return $this->extraData; } } // [EOF] ?>