[TASK] Move and Namespace classes
[Packages/TYPO3.CMS.git] / typo3 / sysext / core / Classes / Error / ErrorHandler.php
1 <?php
2 namespace TYPO3\CMS\Core\Error;
3
4 /***************************************************************
5 * Copyright notice
6 *
7 * (c) 2009-2011 Ingo Renner <ingo@typo3.org>
8 * All rights reserved
9 *
10 * This script is part of the TYPO3 project. The TYPO3 project is
11 * free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * The GNU General Public License can be found at
17 * http://www.gnu.org/copyleft/gpl.html.
18 *
19 * This script is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * This copyright notice MUST APPEAR in all copies of the script!
25 ***************************************************************/
26 /**
27 * Global error handler for TYPO3
28 *
29 * This file is a backport from FLOW3
30 *
31 * @author Rupert Germann <rupi@gmx.li>
32 * @package TYPO3
33 * @subpackage error
34 */
35 class ErrorHandler implements \TYPO3\CMS\Core\Error\ErrorHandlerInterface {
36
37 /**
38 * Error levels which should result in an exception thrown.
39 *
40 * @var array
41 */
42 protected $exceptionalErrors = array();
43
44 /**
45 * Registers this class as default error handler
46 *
47 * @param integer $errorHandlerErrors The integer representing the E_* error level which should be
48 * @return void
49 */
50 public function __construct($errorHandlerErrors) {
51 set_error_handler(array($this, 'handleError'), $errorHandlerErrors);
52 }
53
54 /**
55 * Defines which error levels should result in an exception thrown.
56 *
57 * @param integer $exceptionalErrors The integer representing the E_* error level to handle as exceptions
58 * @return void
59 */
60 public function setExceptionalErrors($exceptionalErrors) {
61 $this->exceptionalErrors = (int) $exceptionalErrors;
62 }
63
64 /**
65 * Handles an error.
66 * If the error is registered as exceptionalError it will by converted into an exception, to be handled
67 * by the configured exceptionhandler. Additionall the error message is written to the configured logs.
68 * If TYPO3_MODE is 'BE' the error message is also added to the flashMessageQueue, in FE the error message
69 * is displayed in the admin panel (as TsLog message)
70 *
71 * @param integer $errorLevel The error level - one of the E_* constants
72 * @param string $errorMessage The error message
73 * @param string $errorFile Name of the file the error occurred in
74 * @param integer $errorLine Line number where the error occurred
75 * @return void
76 * @throws \TYPO3\CMS\Core\Error\Exception with the data passed to this method if the error is registered as exceptionalError
77 */
78 public function handleError($errorLevel, $errorMessage, $errorFile, $errorLine) {
79 // Don't do anything if error_reporting is disabled by an @ sign
80 if (error_reporting() == 0) {
81 return TRUE;
82 }
83 $errorLevels = array(
84 E_WARNING => 'Warning',
85 E_NOTICE => 'Notice',
86 E_USER_ERROR => 'User Error',
87 E_USER_WARNING => 'User Warning',
88 E_USER_NOTICE => 'User Notice',
89 E_STRICT => 'Runtime Notice',
90 E_RECOVERABLE_ERROR => 'Catchable Fatal Error'
91 );
92 $message = (((((('PHP ' . $errorLevels[$errorLevel]) . ': ') . $errorMessage) . ' in ') . $errorFile) . ' line ') . $errorLine;
93 if ($errorLevel & $this->exceptionalErrors) {
94 // We need to manually require the exception classes in case the autoloader is not available at this point yet.
95 // @see http://forge.typo3.org/issues/23444
96 if (!class_exists('TYPO3\\CMS\\Core\\Error\\Exception', FALSE)) {
97 require_once PATH_t3lib . 'class.t3lib_exception.php';
98 require_once PATH_t3lib . 'error/class.t3lib_error_exception.php';
99 }
100 throw new \TYPO3\CMS\Core\Error\Exception($message, 1);
101 } else {
102 switch ($errorLevel) {
103 case E_USER_ERROR:
104
105 case E_RECOVERABLE_ERROR:
106 $severity = 2;
107 break;
108 case E_USER_WARNING:
109
110 case E_WARNING:
111 $severity = 1;
112 break;
113 default:
114 $severity = 0;
115 break;
116 }
117 $logTitle = ('Core: Error handler (' . TYPO3_MODE) . ')';
118 // Write error message to the configured syslogs,
119 // see: $TYPO3_CONF_VARS['SYS']['systemLog']
120 if ($errorLevel & $GLOBALS['TYPO3_CONF_VARS']['SYS']['syslogErrorReporting']) {
121 \TYPO3\CMS\Core\Utility\GeneralUtility::sysLog($message, $logTitle, $severity);
122 }
123 // In case an error occurs before a database connection exists, try
124 // to connect to the DB to be able to write an entry to devlog/sys_log
125 if (is_object($GLOBALS['TYPO3_DB']) && empty($GLOBALS['TYPO3_DB']->link)) {
126 try {
127 $GLOBALS['TYPO3_DB']->connectDB();
128 } catch (\Exception $e) {
129
130 }
131 }
132 // Write error message to devlog extension(s),
133 // see: $TYPO3_CONF_VARS['SYS']['enable_errorDLOG']
134 if (TYPO3_ERROR_DLOG) {
135 \TYPO3\CMS\Core\Utility\GeneralUtility::devLog($message, $logTitle, $severity + 1);
136 }
137 // Write error message to TSlog (admin panel)
138 if (is_object($GLOBALS['TT'])) {
139 $GLOBALS['TT']->setTSlogMessage(($logTitle . ': ') . $message, $severity + 1);
140 }
141 // Write error message to sys_log table (ext: belog, Tools->Log)
142 if ($errorLevel & $GLOBALS['TYPO3_CONF_VARS']['SYS']['belogErrorReporting']) {
143 $this->writeLog(($logTitle . ': ') . $message, $severity);
144 }
145 // Add error message to the flashmessageQueue
146 if (defined('TYPO3_ERRORHANDLER_MODE') && TYPO3_ERRORHANDLER_MODE == 'debug') {
147 $flashMessage = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessage', $message, 'PHP ' . $errorLevels[$errorLevel], $severity);
148 \TYPO3\CMS\Core\Messaging\FlashMessageQueue::addMessage($flashMessage);
149 }
150 }
151 // Don't execute PHP internal error handler
152 return TRUE;
153 }
154
155 /**
156 * Writes an error in the sys_log table
157 *
158 * @param string $logMessage Default text that follows the message (in english!).
159 * @param integer $severity The eror level of the message (0 = OK, 1 = warning, 2 = error)
160 * @return void
161 */
162 protected function writeLog($logMessage, $severity) {
163 if (is_object($GLOBALS['TYPO3_DB']) && !empty($GLOBALS['TYPO3_DB']->link)) {
164 $userId = 0;
165 $workspace = 0;
166 if (is_object($GLOBALS['BE_USER'])) {
167 if (isset($GLOBALS['BE_USER']->user['uid'])) {
168 $userId = $GLOBALS['BE_USER']->user['uid'];
169 }
170 if (isset($GLOBALS['BE_USER']->workspace)) {
171 $workspace = $GLOBALS['BE_USER']->workspace;
172 }
173 }
174 $fields_values = array(
175 'userid' => $userId,
176 'type' => 5,
177 'action' => 0,
178 'error' => $severity,
179 'details_nr' => 0,
180 'details' => $logMessage,
181 'IP' => \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('REMOTE_ADDR'),
182 'tstamp' => $GLOBALS['EXEC_TIME'],
183 'workspace' => $workspace
184 );
185 $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_log', $fields_values);
186 }
187 }
188
189 }
190
191
192 ?>