PHP 7 Error Handling

teroristd

Registered
Здравейте, разбрах че в php7 обработването на грешките е вече на по-високо ниво, и ще се работи изцяло с Exception-и. Ако може да помогнете да оправя системата. Целта е да прихващам не само Exception-ите, но и Warning и Notice и да ги записвам в log файлове.

Код:
//Start Errors functions
    public function exceptionHandler(\Еxception $exception) {

        $this->_exception = $this->_config->getConfigFile('exArr');

        if ($this->_config && $this->_exception['exception'] == TRUE) {

            echo '<pre>' . print_r($exception, TRUE) . '</pre>';

        }
        else {

            $this->displayError($exception->getCode());

            error_log($exception . PHP_EOL . PHP_EOL, 3, "../errors/FatalErrorLog.log");
        }
    }


    public function displayError($error) {

        try {

            $this->_view->display('errors/' . $error);
        }
        catch (\Еxception $error) {

            $headerStatus = $this->_common->headerStatus($error);

            if ($headerStatus >= 400 && $headerStatus <= 499) {

                $this->displayError(404);

                exit;
            }
            if ($headerStatus >= 500) {

                $this->displayError(500);

                exit;
            }
        }
    }


    public function shutdownHandler() {

        $error = error_get_last();

        if ($error['type'] === E_ERROR || $error['type'] === E_USER_ERROR || $error['type'] === E_RECOVERABLE_ERROR || $error['type'] === E_PARSE || $error['type'] === E_CORE_ERROR || $error['type'] === E_CORE_WARNING || $error['type'] === E_COMPILE_ERROR || $error['type'] === E_COMPILE_WARNING) {

            $this->displayError(500);
        }
        else {

            $this->errorHandler($error['type'], $error['message'], $error['file'], $error['line']);
        }
    }


    public function errorHandler($errno, $errstr, $errfile, $errline) {

        switch ($errno) {

            case E_WARNING:

            case E_USER_WARNING:

                $ErrorWarning = 'WARNING error ' . $errstr . ' at ' . $errfile . ':' . $errline;

                error_log($ErrorWarning . PHP_EOL . PHP_EOL, 3, "../errors/WarningErrorLog.log");

                continue;

            case E_NOTICE:

            case E_USER_NOTICE:

            case E_DEPRECATED:

            case E_USER_DEPRECATED:

            case E_STRICT:

                $ErrorStrict = 'STRICT error ' . $errstr . ' at ' . $errfile . ':' . $errline;

                error_log($ErrorStrict . PHP_EOL . PHP_EOL, 3, "../errors/NoticeErrorLog.log");

                break;
        }
    }
 
Много яко, 1394 мнения и все още не си се научил, че всичко си пише в php.net :D
Генерално, Warnings и Notices са си Warnings и Notices. Тях обработваш по старият начин. Ако искаш може error_handler-а да хвърля изключение и така да обработваш всичко в твоят exceptionHandler();
Това е описано в документацията:
http://php.net/manual/en/class.errorexception.php
Поздрави.
 
Зареждаш твой си error handler със set_error_handler(). Може да разгледаш компонента Debug на Symfony за повече инфо.
 
imagination каза:
Много яко, 1394 мнения и все още не си се научил, че всичко си пише в php.net :D
Генерално, Warnings и Notices са си Warnings и Notices. Тях обработваш по старият начин. Ако искаш може error_handler-а да хвърля изключение и така да обработваш всичко в твоят exceptionHandler();
Това е описано в документацията:
http://php.net/manual/en/class.errorexception.php
Поздрави.

Благодаря за отговора но, ако беше толкова просто този форум нямаше да съществува. Щом питаме или не сме намерили информацията която ни трябва, или не сме я разбрали. В случая кода който съм дал не работи. Аз открих защо, но не в php.net. След като разбираш нещата, и искаш да помогнеш можеш да погледнеш какъв код съм пуснал, ако греша някъде или мислиш че може да се направи по-добре, да кажеш какво, къде и как. Можеш и да напишеш пет реда код, да покажеш как стават нещата и така. Аз може да не пиша винаги код, но и никога не се подигравам с това че някой не знае или не е разбрал, и не пускам коментари от типа на потърси в google.
 
Незнам къде си прочел, че изцяло ще се ползват Exception но мисля, че не е вярно това.
http://php.net/manual/en/language.errors.php7.php

PHP 7 changes how most errors are reported by PHP. Instead of reporting errors through the traditional error reporting mechanism used by PHP 5, most errors are now reported by throwing Error exceptions.

Според текста повечето ерори ще се обработват с изключения но не всичките. Та по темата ще ти дам мой код и дано ти е полезен. За да го извикаш правиш просто така:
PHP:
ErrorHandler::getInstance();

Eто и класът:

PHP:
<?php
namespace System\Core;

class ErrorHandler
{
	private static $_instance = null;
	
	private $errorConstants = array(
       	E_ERROR				=>	'Error',
		E_WARNING			=>	'Warning',
		E_PARSE				=>	'Parsing Error',
		E_NOTICE			=>	'Notice',
		E_CORE_ERROR		=>	'Core Error',
		E_CORE_WARNING		=>	'Core Warning',
		E_COMPILE_ERROR		=>	'Compile Error',
		E_COMPILE_WARNING	=>	'Compile Warning',
		E_USER_ERROR		=>	'User Error',
		E_USER_WARNING		=>	'User Warning',
		E_USER_NOTICE		=>	'User Notice',
		E_STRICT			=>	'Runtime Notice'	
    );
	
    private function __construct()
	{
        set_exception_handler(array($this, 'exceptionHandler'));
		set_error_handler(array($this, 'errorHandler'));
    }

    public function exceptionHandler(\Exception $e)
	{
		$errString = print_r($e,true);
		$this->errorLog($errString);
		$error = '[Exception]: '.$e->getMessage().'[File]'.$e->getFile().' [on line] '.$e->getLine();
		$this->display($e->getMessage(),$error,__FUNCTION__);
    }
	
	public function errorHandler($severity, $message, $filepath, $line)
	{
        $errString = (array_key_exists($severity, $this->errorConstants)) ? $this->errorConstants[$severity] : $severity;
		$error = '['.$errString.']: '.$message.' [in] '.$filepath.' [on line] '.$line;
		$this->errorLog($error);
		$this->display($errString,$error,__FUNCTION__);
		
    }
	
	public function display($title,$error,$from)
	{
		switch ($from) {
			case $from == 'errorHandler' and FRAMEWORK_SHOW_ERROR:
				$this->display($title,$error,__FUNCTION__);
				break;
			case $from == 'exceptionHandler' and FRAMEWORK_SHOW_EXCEPTION:
				$this->display($title,$error,__FUNCTION__);
				break;
			case __FUNCTION__:
				$display = file_get_contents(FRAMEWORK_FOLDER_TEMPLATES.FRAMEWORK_ERROR_TEMPLATE);
				$display = str_replace('{title}',trim($title), $display);
				$display = str_replace('{description}',FRAMEWORK_SHORT_NAME.":", $display);
				$display = str_replace('{error}',trim($error), $display);
				print $display;
				exit();
				break;
			default:  
				$this->display('Warning','Unknown error!',__FUNCTION__);
				break;
		}	
	}
	
	public function errorLog($message)
	{
		$message = FRAMEWORK_SHORT_NAME.":{\n\t".trim($message)."\n}";
		error_log($message);
	}
	
	public static function getInstance()
	{
        if (empty(self::$_instance)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }
}

В самият код има дисплей метод на който мястото не му е там, но по принцип тестово го създадох така. Не съм променял много неща и е доста сходен с твоят код.
 
teroristd каза:
Благодаря Дака, ще го прегледам.

Дано ти свърши работа кода. Малко е дървен но мисля, че в него има решение на проблема който имаш ти. :)
 

Back
Горе