]> git.mxchange.org Git - core.git/blobdiff - framework/main/exceptions/class_FrameworkException.php
Continued with renaming-season:
[core.git] / framework / main / exceptions / class_FrameworkException.php
diff --git a/framework/main/exceptions/class_FrameworkException.php b/framework/main/exceptions/class_FrameworkException.php
new file mode 100644 (file)
index 0000000..866e59f
--- /dev/null
@@ -0,0 +1,213 @@
+<?php
+// Own namespace
+namespace CoreFramework\Generic;
+
+// Import SPL stuff
+use \ReflectionException;
+
+/**
+ * A general abstract exception. You should not throw this even when you
+ * remove the "abstract" key-word. Better you make your own exception and
+ * attach a dedicated message to it.
+ *
+ * @author             Roland Haeder <webmaster@shipsimu.org>
+ * @version            0.0.0
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
+ * @license            GNU GPL 3.0 or any newer version
+ * @link               http://www.shipsimu.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 <http://www.gnu.org/licenses/>.
+ */
+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: <pre>%s</pre>',
+                               $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 = "<br />\nDebug backtrace begin:<br />\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.": <pre>".htmlentities(print_r($dbgInfo['args'], TRUE))."</pre>";
+                               $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 = '<em id="debug_args_' . $dbgIndex . '">' . $info . '</em>';
+
+                       // 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 <em id=\"debug_id_".$dbgIndex."\">".$dbgIndex."</em> <em id=\"debug_file_".$dbgIndex."\">".$file."</em> (<em id=\"debug_line_".$dbgIndex."\">".$line."</em>) -&gt; ".$dbgInfo['function'].'('.$info.")<br />\n";
+               } // END - if
+
+               // Add end-message
+               $dbgMsg .= "Debug backtrace end<br />\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;
+       }
+
+}