00001 <?php 00002 00006 class oxExceptionHandler 00007 { 00013 protected $_sFileName = 'EXCEPTION_LOG.txt'; 00014 00020 protected $_iDebug = 0; 00021 00027 public function __construct( $iDebug = 0 ) 00028 { 00029 $this->_iDebug = (int) $iDebug; 00030 } 00031 00039 public function setIDebug($iDebug) 00040 { 00041 $this->_iDebug = $iDebug; 00042 } 00043 00051 public function setLogFileName($sFile) 00052 { 00053 $this->_sFileName = $sFile; 00054 } 00055 00061 public function getLogFileName() 00062 { 00063 return $this->_sFileName; 00064 } 00065 00073 public function handleUncaughtException( Exception $oEx ) 00074 { 00075 // split between php or shop exception 00076 if ( !$oEx instanceof oxException ) { 00077 $this->_dealWithNoOxException( $oEx ); 00078 return; // Return straight away ! (in case of unit testing) 00079 } 00080 00081 $oEx->setLogFileName( $this->_sFileName ); // set common log file ... 00082 00083 $this->_uncaughtException( $oEx ); // Return straight away ! (in case of unit testing) 00084 } 00085 00094 protected function _uncaughtException( oxException $oEx ) 00095 { 00096 // exception occured in function processing 00097 $oEx->setNotCaught(); 00098 // general log entry for all exceptions here 00099 $oEx->debugOut(); 00100 00101 if ( defined( 'OXID_PHP_UNIT' ) ) { 00102 return $oEx->getString(); 00103 } elseif ( 0 != $this->_iDebug ) { 00104 oxUtils::getInstance()->showMessageAndExit( $oEx->getString() ); 00105 } 00106 00107 //simple safe redirect in productive mode 00108 $sShopUrl = oxConfig::getInstance()->getShopMainUrl(); 00109 $this->_safeShopRedirectAndExit( $sShopUrl . "offline.html" ); 00110 00111 //should not be reached 00112 return ; 00113 } 00114 00123 protected function _dealWithNoOxException( Exception $oEx ) 00124 { 00125 if ( 0 != $this->_iDebug ) { 00126 $sLogMsg = date( 'Y-m-d H:i:s' ) . $oEx . "\n---------------------------------------------\n"; 00127 oxUtils::getInstance()->writeToLog( $sLogMsg, $this->getLogFileName() ); 00128 if ( defined( 'OXID_PHP_UNIT' ) ) { 00129 return; 00130 } elseif ( 0 != $this->_iDebug ) { 00131 oxUtils::getInstance()->showMessageAndExit( $sLogMsg ); 00132 } 00133 } 00134 00135 $sShopUrl = oxConfig::getInstance()->getShopMainUrl(); 00136 $this->_safeShopRedirectAndExit( $sShopUrl . "offline.html" ); 00137 } 00138 00148 protected function _safeShopRedirectAndExit($sUrl) 00149 { 00150 // No redirects in unit testing .. as redirection ends also unit testing script.. 00151 if ( defined('OXID_PHP_UNIT')) { 00152 return ; 00153 } 00154 00155 //make the redirect directly to be independetn from other objects 00156 header("HTTP/1.1 500 Internal Server Error"); 00157 header("Location: ".$sUrl); 00158 header("Connection: close"); 00159 exit(); 00160 } 00161 00173 public function __call( $sMethod, $aArgs) 00174 { 00175 if ( defined( 'OXID_PHP_UNIT' ) ) { 00176 if ( substr( $sMethod, 0, 4) == "UNIT") { 00177 $sMethod = str_replace( "UNIT", "_", $sMethod); 00178 } 00179 if ( method_exists( $this, $sMethod)) { 00180 return call_user_func_array( array( & $this, $sMethod), $aArgs ); 00181 } 00182 } 00183 00184 throw new oxSystemComponentException( "Function '$sMethod' does not exist or is not accessable! (".__CLASS__.")".PHP_EOL); 00185 } 00186 }