Index: t3lib/config_default.php =================================================================== --- t3lib/config_default.php (Revision 6190) +++ t3lib/config_default.php (Arbeitskopie) @@ -157,10 +157,14 @@ ) ), 'useCachingFramework' => 0, // Boolean: Enable this if you want to use the caching framework by default for the core caches cache_pages, cache_pagesection and cache_hash. - 'displayErrors' => -1, // Integer, -1,0,1,2. 0=Do not display any PHP error messages. 1=Display error messages. 2=Display only if client matches TYPO3_CONF_VARS[SYS][devIPmask]. -1=Default setting. With this option, you can override the PHP setting "display_errors". It is suggested that you set this to "0" and enable the "error_log" option in php.ini instead. - 'exceptionHandler' => 't3lib_error_ProductionExceptionHandler', // String: Classname to handle exceptions that might happen in the TYPO3-code. Leave empty to disable exception handling, or set to t3lib_error_ProductionExceptionHandler for nice error messages when something wents wrong, or to t3lib_error_DebugExceptionHandler for a complete stack trace of any encountered exception. Note that if devIPmask matches, t3lib_error_DebugExceptionHandler will be used, regardless of this setting. - 'errorHandler' => '', // String: Classname to handle PHP errors. E.g.: t3lib_error_ErrorHandler.This class will turn the error into an exception (to be handled by the exceptionHandler). - 'exceptionalErrors' => E_ALL ^ E_NOTICE, // Integer: The E_* constant that will be handled as an exception by t3lib_error_ErrorHandler. Default is "E_ALL ^ E_NOTICE" (6135) and "0" if displayError=0. Some values for errors: E_ALL=6143, E_ALL ^ E_NOTICE ^ E_WARNING=6133. See php documentation for more details on this integer. + 'displayErrors' => -1, // Integer: -1,0,1,2. Configures whether PHP errors should be displayed. 0 = Do not display any PHP error messages. Overrides the value of “exceptionalErrors” and sets it to 0 (= no errors are turned into exceptions), the configured “productionExceptionHandler” is used as exception handler, 1 = Display error messages with the registered errorhandler. The configured “debugExceptionHandler” is used as exception handler. 2 = Display errors only if client matches TYPO3_CONF_VARS[SYS][devIPmask]. If devIPmask matches the users IP address the configured “debugExceptionHandler” is used for exceptions, if not “productionExceptionHandler” will be used. -1 = Default setting. With this option, you can override the PHP setting "display_errors". If devIPmask matches the users IP address the configured “debugExceptionHandler” is used for exceptions, if not “productionExceptionHandler” will be used. + 'productionExceptionHandler' => 't3lib_error_ProductionExceptionHandler', // String: Classname to handle exceptions that might happen in the TYPO3-code. Leave empty to disable exception handling. Default: “t3lib_error_ProductionExceptionHandler”. This exception handler displays a nice error message when something went wrong. The error message is logged to the configured logs. Note: The configured "productionExceptionHandler" is used if displayErrors is set to “0” or to “-1” and devIPmask doesn't match the users IP. + 'debugExceptionHandler' => 't3lib_error_DebugExceptionHandler', // String: Classname to handle exceptions that might happen in the TYPO3-code. Leave empty to disable exception handling. Default: “t3lib_error_DebugExceptionHandler”. This exception handler displays the complete stack trace of any encountered exception. The error message and the stack trace is logged to the configured logs. Note: The configured "debugExceptionHandler" is used if displayErrors is set to “1” and if displayErrors is “-1” or “2” and the devIPmask matches the users IP. + 'errorHandler' => 't3lib_error_ErrorHandler', // String: Classname to handle PHP errors. E.g.: t3lib_error_ErrorHandler. This class displays and logs all errors that are registered as "errorHandlerErrors" ([SYS][errorHandlerErrors]). Leave empty to disable error handling. Errors can be logged to syslog (see: [SYS][systemLog]) to the installed developer log and to the "syslog" table. If an error is registered in "exceptionalErrors" ([SYS][exceptionalErrors]) it will be turned into an exception to be handled by the configured exceptionHandler. + 'errorHandlerErrors'=> E_ALL ^ E_NOTICE, // Integer: The E_* constant that will be handled by the errorhandler. Default is "E_ALL ^ E_NOTICE". + 'exceptionalErrors' => E_ALL ^ E_NOTICE ^ E_WARNING ^ E_USER_ERROR ^ E_USER_NOTICE ^ E_USER_WARNING, // Integer: The E_* constant that will be handled as an exception by t3lib_error_ErrorHandler. Default is "E_ALL ^ E_NOTICE ^ E_WARNING ^ E_USER_ERROR ^ E_USER_NOTICE ^ E_USER_WARNING" (4341) and "0" if displayError=0. Some values for errors: E_ALL=6143, E_ALL ^ E_NOTICE ^ E_WARNING=6133. See php documentation for more details on this integer. + 'enable_errorDLOG' => 0, // Boolean: If set, errors are written to the developer log (requires an installed *devlog* extension). + 'enable_exceptionDLOG' => 0, // Boolean: If set, exceptions are written to the developer log (requires an installed *devlog* extension). ), 'EXT' => Array ( // Options related to the Extension Management 'noEdit' => 1, // Boolean: If set, the Extension Manager does NOT allow extension files to be edited! (Otherwise both local and global extensions can be edited.) @@ -486,28 +490,34 @@ $T3_SERVICES = array(); // Error & exception handling -$TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] = $TYPO3_CONF_VARS['SYS']['exceptionHandler']; +$TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] = $TYPO3_CONF_VARS['SYS']['productionExceptionHandler']; $TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionalErrors'] = $TYPO3_CONF_VARS['SYS']['exceptionalErrors']; // Turn error logging on/off. -if (($displayErrors=intval($TYPO3_CONF_VARS['SYS']['displayErrors']))!='-1') { - if ($displayErrors==2) { // Special value "2" enables this feature only if $TYPO3_CONF_VARS[SYS][devIPmask] matches +if (($displayErrors = intval($TYPO3_CONF_VARS['SYS']['displayErrors'])) != '-1') { + if ($displayErrors == 2) { // Special value "2" enables this feature only if $TYPO3_CONF_VARS[SYS][devIPmask] matches if (t3lib_div::cmpIP(t3lib_div::getIndpEnv('REMOTE_ADDR'), $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'])) { - $displayErrors=1; - $TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] = 't3lib_error_DebugExceptionHandler'; + $displayErrors = 1; } else { - $displayErrors=0; + $displayErrors = 0; } } if ($displayErrors == 0) { $TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionalErrors'] = 0; } + if ($displayErrors == 1) { + $TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] = $TYPO3_CONF_VARS['SYS']['debugExceptionHandler']; + define('TYPO3_ERRORHANDLER_MODE','debug'); + } + @ini_set('display_errors', $displayErrors); } elseif (t3lib_div::cmpIP(t3lib_div::getIndpEnv('REMOTE_ADDR'), $GLOBALS['TYPO3_CONF_VARS']['SYS']['devIPmask'])) { // with displayErrors = -1 (default), turn on debugging if devIPmask matches: - $TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] = 't3lib_error_DebugExceptionHandler'; + $TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] = $TYPO3_CONF_VARS['SYS']['debugExceptionHandler']; } + + // Set PHP memory limit depending on value of $TYPO3_CONF_VARS["SYS"]["setMemoryLimit"] if(intval($TYPO3_CONF_VARS["SYS"]["setMemoryLimit"])>16) { @ini_set('memory_limit',intval($TYPO3_CONF_VARS["SYS"]["setMemoryLimit"]).'m'); @@ -548,6 +558,9 @@ // Define "TYPO3_DLOG" constant define('TYPO3_DLOG', $GLOBALS['TYPO3_CONF_VARS']['SYS']['enable_DLOG']); +define('TYPO3_ERROR_DLOG', $GLOBALS['TYPO3_CONF_VARS']['SYS']['enable_errorDLOG']); +define('TYPO3_EXCEPTION_DLOG', $GLOBALS['TYPO3_CONF_VARS']['SYS']['enable_exceptionDLOG']); + // Unsetting other reserved global variables: // Those which are/can be set in "stddb/tables.php" files: unset($PAGES_TYPES); Index: t3lib/error/class.t3lib_error_abstractexceptionhandler.php =================================================================== --- t3lib/error/class.t3lib_error_abstractexceptionhandler.php (Revision 6190) +++ t3lib/error/class.t3lib_error_abstractexceptionhandler.php (Arbeitskopie) @@ -34,6 +34,8 @@ * @version $Id: AbstractExceptionHandler.php 3189 2009-09-16 13:36:22Z k-fish $ */ abstract class t3lib_error_AbstractExceptionHandler implements t3lib_error_ExceptionHandlerInterface, t3lib_Singleton { + const CONTEXT_WEB = 'WEB'; + const CONTEXT_CLI = 'CLI'; /** * Displays the given exception @@ -50,6 +52,82 @@ $this->echoExceptionWeb($exception); } } + + + /** + * Writes exception to different logs + * + * @param Exception $exception The exception + * @param string the context where the exception was thrown, WEB or CLI + * @return void + * @see t3lib_div::sysLog(), t3lib_div::devLog() + */ + protected function writeLogEntries(Exception $exception, $context) { + $filePathAndName = $exception->getFile(); + $exceptionCodeNumber = ($exception->getCode() > 0) ? '#' . $exception->getCode() . ': ' : ''; + $logTitle = 'Core: Exception handler (' . $context . ')'; + $logMessage = 'Uncaught TYPO3 Exception: ' . $exceptionCodeNumber . $exception->getMessage() . ' | ' . + get_class($exception) . ' thrown in file ' . $filePathAndName . ' in line ' . $exception->getLine(); + $backtrace = $exception->getTrace(); + + // write error message to the configured syslogs + t3lib_div::sysLog($logMessage, $logTitle, 4); + + // In case an error occurs before a database connection exists, try + // to connect to the DB to be able to write the devlog/sys_log entry + if (isset($GLOBALS['TYPO3_DB']) && is_object($GLOBALS['TYPO3_DB']) && empty($GLOBALS['TYPO3_DB']->link)) { + $GLOBALS['TYPO3_DB']->connectDB(); + } + + // write error message to devlog + // see: $TYPO3_CONF_VARS['SYS']['enable_exceptionDLOG'] + if (TYPO3_EXCEPTION_DLOG) { + t3lib_div::devLog($logMessage, $logTitle, 3, array( + 'TYPO3_MODE' => TYPO3_MODE, + 'backtrace' => $backtrace + )); + } + + // write error message to sys_log table + $this->writeLog($logTitle . ': ' . $logMessage); + } + + /** + * Writes an exception in the sys_log table + * + * @param string Default text that follows the message. + * @return void + */ + protected function writeLog($logMessage) { + if (is_object($GLOBALS['TYPO3_DB']) && !empty($GLOBALS['TYPO3_DB']->link)) { + $userId = 0; + $workspace = 0; + if (is_object($GLOBALS['BE_USER'])) { + if (isset($GLOBALS['BE_USER']->user['uid'])) { + $userId = $GLOBALS['BE_USER']->user['uid']; + } + if (isset($GLOBALS['BE_USER']->workspace)) { + $workspace = $GLOBALS['BE_USER']->workspace; + } + } + + $fields_values = Array ( + 'userid' => $userId, + 'type' => 5, + 'action' => 0, + 'error' => 2, + 'details_nr' => 0, + 'details' => $logMessage, + 'IP' => t3lib_div::getIndpEnv('REMOTE_ADDR'), + 'tstamp' => $GLOBALS['EXEC_TIME'], + 'workspace' => $workspace + ); + + $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_log', $fields_values); + } + } + + } if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/error/class.t3lib_error_abstractexceptionhandler.php']) { Index: t3lib/error/class.t3lib_error_debugexceptionhandler.php =================================================================== --- t3lib/error/class.t3lib_error_debugexceptionhandler.php (Revision 6190) +++ t3lib/error/class.t3lib_error_debugexceptionhandler.php (Arbeitskopie) @@ -70,6 +70,8 @@ // $moreInformationLink = ($exceptionCodeNumber != '') ? '(More information)' : ''; $backtraceCode = $this->getBacktraceCode($exception->getTrace()); + $this->writeLogEntries($exception, self::CONTEXT_WEB); + echo ' @@ -125,8 +127,8 @@ */ public function echoExceptionCLI(Exception $exception) { $filePathAndName = $exception->getFile(); - $exceptionCodeNumber = ($exception->getCode() > 0) ? '#' . $exception->getCode() . ': ' : ''; + $this->writeLogEntries($exception, self::CONTEXT_CLI); echo "\nUncaught TYPO3 Exception " . $exceptionCodeNumber . $exception->getMessage() . "\n"; echo "thrown in file " . $filePathAndName . "\n"; Index: t3lib/error/class.t3lib_error_productionexceptionhandler.php =================================================================== --- t3lib/error/class.t3lib_error_productionexceptionhandler.php (Revision 6190) +++ t3lib/error/class.t3lib_error_productionexceptionhandler.php (Arbeitskopie) @@ -54,6 +54,7 @@ if (!headers_sent()) { header("HTTP/1.1 500 Internal Server Error"); } + $this->writeLogEntries($exception,self::CONTEXT_WEB); t3lib_timeTrack::debug_typo3PrintError(get_class($exception), $exception->getMessage(), 0, t3lib_div::getIndpEnv('TYPO3_SITE_URL')); } @@ -65,6 +66,7 @@ * @return void */ public function echoExceptionCLI(Exception $exception) { + $this->writeLogEntries($exception, self::CONTEXT_CLI); exit(1); } } Index: t3lib/error/interface.t3lib_error_errorhandlerinterface.php =================================================================== --- t3lib/error/interface.t3lib_error_errorhandlerinterface.php (Revision 6190) +++ t3lib/error/interface.t3lib_error_errorhandlerinterface.php (Arbeitskopie) @@ -36,24 +36,36 @@ interface t3lib_error_ErrorHandlerInterface { /** - * Defines which error levels result should result in an exception thrown. * Registers this class as default error handler * - * @param integer $exceptionalErrors The integer representing the E_* error level to handle as exceptions + * @param integer The integer representing the E_* error level which should be + * handled by the registered error handler. * @return void */ - public function setErrorHandlerForExceptionalErrors($exceptionalErrors); + public function __construct($errorHandlerErrors); /** - * Handles an error by converting it into an exception + * Defines which error levels should result in an exception thrown. * - * @param integer $errorLevel The error level - one of the E_* constants - * @param string $errorMessage The error message - * @param string $errorFile Name of the file the error occurred in - * @param integer $errorLine Line number where the error occurred + * @param integer The integer representing the E_* error level to handle as exceptions * @return void - * @throws t3lib_error_Exception with the data passed to this method */ + public function setExceptionalErrors($exceptionalErrors); + + /** + * Handles an error. + * If the error is registered as exceptionalError it will by converted into an exception, to be handled + * by the configured exceptionhandler. Additionall the error message is written to the configured logs. + * If TYPO3_MODE is 'BE' the error message is also added to the flashMessageQueue, in FE the error message + * is displayed in the admin panel (as TsLog message) + * + * @param integer The error level - one of the E_* constants + * @param string The error message + * @param string Name of the file the error occurred in + * @param integer Line number where the error occurred + * @return void + * @throws t3lib_error_Exception with the data passed to this method if the error is registered as exceptionalError + */ public function handleError($errorLevel, $errorMessage, $errorFile, $errorLine); } Index: t3lib/error/class.t3lib_error_errorhandler.php =================================================================== --- t3lib/error/class.t3lib_error_errorhandler.php (Revision 6190) +++ t3lib/error/class.t3lib_error_errorhandler.php (Arbeitskopie) @@ -31,39 +31,60 @@ * * @package TYPO3 * @subpackage t3lib_error + * @author Rupert Germann * @version $Id: ErrorHandler.php 3195 2009-09-17 11:27:14Z k-fish $ */ class t3lib_error_ErrorHandler implements t3lib_error_ErrorHandlerInterface { /** - * @var array + * Error levels which should result in an exception thrown. + * + * @var integer */ protected $exceptionalErrors = array(); /** - * Defines which error levels result should result in an exception thrown. * Registers this class as default error handler * - * @param integer $exceptionalErrors The integer representing the E_* error level to handle as exceptions + * @param integer The integer representing the E_* error level which should be + * handled by the registered error handler. * @return void */ - public function setErrorHandlerForExceptionalErrors($exceptionalErrors) { + public function __construct($errorHandlerErrors) { + set_error_handler(array($this, 'handleError'), $errorHandlerErrors); + } + + + + /** + * Defines which error levels should result in an exception thrown. + * + * @param integer The integer representing the E_* error level to handle as exceptions + * @return void + */ + public function setExceptionalErrors($exceptionalErrors) { $this->exceptionalErrors = (int)$exceptionalErrors; - set_error_handler(array($this, 'handleError'), $this->exceptionalErrors); + } /** - * Handles an error by converting it into an exception + * Handles an error. + * If the error is registered as exceptionalError it will by converted into an exception, to be handled + * by the configured exceptionhandler. Additionall the error message is written to the configured logs. + * If TYPO3_MODE is 'BE' the error message is also added to the flashMessageQueue, in FE the error message + * is displayed in the admin panel (as TsLog message) * - * @param integer $errorLevel The error level - one of the E_* constants - * @param string $errorMessage The error message - * @param string $errorFile Name of the file the error occurred in - * @param integer $errorLine Line number where the error occurred + * @param integer The error level - one of the E_* constants + * @param string The error message + * @param string Name of the file the error occurred in + * @param integer Line number where the error occurred * @return void - * @throws t3lib_error_Exception with the data passed to this method + * @throws t3lib_error_Exception with the data passed to this method if the error is registered as exceptionalError */ public function handleError($errorLevel, $errorMessage, $errorFile, $errorLine) { + // don't do anything if error_reporting is disabled by an @ sign if (error_reporting()==0) { return TRUE; } + $errorLevels = array ( E_WARNING => 'Warning', E_NOTICE => 'Notice', @@ -74,12 +95,101 @@ E_RECOVERABLE_ERROR => 'Catchable Fatal Error' ); + $message = 'PHP ' .$errorLevels[$errorLevel] . ': ' . $errorMessage . ' in ' . $errorFile . ' line ' . $errorLine; + if ($errorLevel & $this->exceptionalErrors) { - throw new t3lib_error_Exception($errorLevels[$errorLevel] . ': ' . $errorMessage . ' in ' . $errorFile . ' line ' . $errorLine, 1); + throw new t3lib_error_Exception($message, 1); + } else { + + switch ($errorLevel) { + case E_USER_ERROR: + case E_RECOVERABLE_ERROR: + $severity = 2; + break; + case E_USER_WARNING: + case E_WARNING: + $severity = 1; + break; + default: + $severity = 0; + break; + } + + $logTitle = 'Core: Error handler (' . TYPO3_MODE . ')'; + + // Write error message to the configured syslogs, + // see: $TYPO3_CONF_VARS['SYS']['systemLog'] + t3lib_div::sysLog($message, $logTitle, $severity); + + // In case an error occurs before a database connection exists, try + // to connect to the DB to be able to write an entry to devlog/sys_log + if (is_object($GLOBALS['TYPO3_DB']) && empty($GLOBALS['TYPO3_DB']->link)) { + $GLOBALS['TYPO3_DB']->connectDB(); + } + + // Write error message to devlog extension(s), + // see: $TYPO3_CONF_VARS['SYS']['enable_errorDLOG'] + if (TYPO3_ERROR_DLOG) { + t3lib_div::devLog($message, $logTitle, $severity + 1); + } + // Write error message to TSlog (admin panel) + if (is_object($GLOBALS['TT'])) { + $GLOBALS['TT']->setTSlogMessage($logTitle . ': ' . $message, $severity + 1); + } + // Write error message to sys_log table (ext: belog, Tools->Log) + $this->writeLog($logTitle . ': ' . $message, $severity); + + // Add error message to the flashmessageQueue + if (TYPO3_ERRORHANDLER_MODE == 'debug') { + $flashMessage = t3lib_div::makeInstance( + 't3lib_FlashMessage', + $message, + 'PHP ' . $errorLevels[$errorLevel], + $severity + ); + t3lib_FlashMessageQueue::addMessage($flashMessage); + } } + // Don't execute PHP internal error handler return TRUE; } + + /** + * Writes an error in the sys_log table + * + * @param string Default text that follows the message (in english!). + * @param integer The eror level of the message (0 = OK, 1 = warning, 2 = error) + * @return void + */ + protected function writeLog($logMessage, $severity) { + if (is_object($GLOBALS['TYPO3_DB']) && !empty($GLOBALS['TYPO3_DB']->link)) { + $userId = 0; + $workspace = 0; + if (is_object($GLOBALS['BE_USER'])) { + if (isset($GLOBALS['BE_USER']->user['uid'])) { + $userId = $GLOBALS['BE_USER']->user['uid']; + } + if (isset($GLOBALS['BE_USER']->workspace)) { + $workspace = $GLOBALS['BE_USER']->workspace; + } + } + + $fields_values = Array ( + 'userid' => $userId, + 'type' => 5, + 'action' => 0, + 'error' => $severity, + 'details_nr' => 0, + 'details' => $logMessage, + 'IP' => t3lib_div::getIndpEnv('REMOTE_ADDR'), + 'tstamp' => $GLOBALS['EXEC_TIME'], + 'workspace' => $workspace + ); + $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_log', $fields_values); + } + } + } Index: typo3/init.php =================================================================== --- typo3/init.php (Revision 6190) +++ typo3/init.php (Arbeitskopie) @@ -189,9 +189,10 @@ // ********************* if ($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] !== '') { if ($TYPO3_CONF_VARS['SYS']['errorHandler'] !== '') { - $errorHandler = t3lib_div::makeInstance($TYPO3_CONF_VARS['SYS']['errorHandler']); - // register an error handler for the given exceptionalErrors - $errorHandler->setErrorHandlerForExceptionalErrors($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionalErrors']); + // register an error handler for the given errorHandlerErrors + $errorHandler = t3lib_div::makeInstance($TYPO3_CONF_VARS['SYS']['errorHandler'], $TYPO3_CONF_VARS['SYS']['errorHandlerErrors']); + // set errors which will be converted in an exception + $errorHandler->setExceptionalErrors($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionalErrors']); } $exceptionHandler = t3lib_div::makeInstance($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler']); } Index: typo3/sysext/cms/tslib/index_ts.php =================================================================== --- typo3/sysext/cms/tslib/index_ts.php (Revision 6190) +++ typo3/sysext/cms/tslib/index_ts.php (Arbeitskopie) @@ -133,9 +133,10 @@ if ($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler'] !== '') { $TT->push('Register Exceptionhandler', ''); if ($TYPO3_CONF_VARS['SYS']['errorHandler'] !== '') { - $errorHandler = t3lib_div::makeInstance($TYPO3_CONF_VARS['SYS']['errorHandler']); - // register an error handler for the given exceptionalErrors - $errorHandler->setErrorHandlerForExceptionalErrors($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionalErrors']); + // register an error handler for the given errorHandlerErrors + $errorHandler = t3lib_div::makeInstance($TYPO3_CONF_VARS['SYS']['errorHandler'], $TYPO3_CONF_VARS['SYS']['errorHandlerErrors']); + // set errors which will be converted in an exception + $errorHandler->setExceptionalErrors($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionalErrors']); } $exceptionHandler = t3lib_div::makeInstance($TYPO3_CONF_VARS['SC_OPTIONS']['errors']['exceptionHandler']); $TT->pull();