Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00%
0 / 1
0.00%
0 / 4
CRAP
0.00%
0 / 35
ErrorHandler
0.00%
0 / 1
0.00%
0 / 4
132
0.00%
0 / 35
 handle(Suite $e)
0.00%
0 / 1
6
0.00%
0 / 10
 errorHandler($errno, $errstr, $errfile, $errline)
0.00%
0 / 1
12
0.00%
0 / 8
 shutdownHandler()
0.00%
0 / 1
30
0.00%
0 / 11
 getSubscribedEvents()
0.00%
0 / 1
2
0.00%
0 / 6
<?php
namespace Codeception\Subscriber;
use Codeception\Event\Suite;
use \Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ErrorHandler implements EventSubscriberInterface
{
/**
* @var bool $stopped to keep shutdownHandler from possible looping.
*/
private static $stopped = false;
/**
* @var int stores bitmask for errors
*/
private $errorLevel = 'E_ALL & ~E_STRICT & ~E_DEPRECATED';
public function handle(Suite $e) {
$settings = $e->getSettings();
if ($settings['error_level']) {
$this->errorLevel = eval("return {$settings['error_level']};");
}
error_reporting($this->errorLevel);
set_exception_handler(array($this, 'errorHandler'));
set_error_handler(array($this, 'errorHandler'));
register_shutdown_function(array($this, 'shutdownHandler'));
}
public function errorHandler($errno, $errstr, $errfile, $errline) {
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting
return false;
}
if (strpos($errstr, 'Cannot modify header information')!==false)
return false;
throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
}
public function shutdownHandler() {
if (self::$stopped)
return;
self::$stopped = true;
$error = error_get_last();
if (!is_array($error)) return;
if (error_reporting() === 0) return;
// not fatal
if ($error['type'] > 1) return;
echo "\n\n\nFATAL ERROR. TESTS NOT FINISHED.\n";
echo sprintf("%s \nin %s:%d\n", $error['message'], $error['file'], $error['line']);
}
static function getSubscribedEvents()
{
return array(
'suite.before' => 'handle'
);
}
}