PHP7錯(cuò)誤處理
PHP 7 改變了大多數(shù)錯(cuò)誤的報(bào)告方式。不同于傳統(tǒng)(PHP 5)的錯(cuò)誤報(bào)告機(jī)制,現(xiàn)在大多數(shù)錯(cuò)誤被作為 Error 異常拋出。
這種 Error 異??梢韵?Exception 異常一樣被第一個(gè)匹配的 try / catch 塊所捕獲。如果沒(méi)有匹配的 catch 塊,則調(diào)用異常處理函數(shù)(事先通過(guò) set_exception_handler() 注冊(cè))進(jìn)行處理。 如果尚未注冊(cè)異常處理函數(shù),則按照傳統(tǒng)方式處理:被報(bào)告為一個(gè)致命錯(cuò)誤(Fatal Error)。
Error 類(lèi)并非繼承自 Exception 類(lèi),所以不能用 catch (Exception e)...來(lái)捕獲Error。你可以用catch(Errore) { … },或者通過(guò)注冊(cè)異常處理函數(shù)( set_exception_handler())來(lái)捕獲 Error。
Error 層次結(jié)構(gòu)
Throwable
Error
ArithmeticError
DivisionByZeroError
AssertionError
ParseError
TypeError
Exception
...
try
{
// Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
// Executed only in PHP 7, will not match in PHP 5
}
catch (Exception $e)
{
// Executed only in PHP 5, will not be reached in PHP 7
}
up
down
9
lubaev dot ka at gmail dot com ¶
11 months ago
php 7.1
try {
// Code that may throw an Exception or ArithmeticError.
} catch (ArithmeticError | Exception $e) {
// pass
}
擴(kuò)展(extend) PHP內(nèi)置的異常處理類(lèi)
用戶(hù)可以用自定義的異常處理類(lèi)來(lái)擴(kuò)展PHP內(nèi)置的異常處理類(lèi)。以下的代碼說(shuō)明了在內(nèi)置的異常處理類(lèi)中,哪些屬性和方法在子類(lèi)中是可訪問(wèn)和繼承的。
Example #1 內(nèi)置的異常處理類(lèi)
?php
class Exception
{
protected $message = 'Unknown exception'; // 異常信息
private $string; // __toString cache
protected $code = 0; // 用戶(hù)自定義異常代碼
protected $file; // 發(fā)生異常的文件名
protected $line; // 發(fā)生異常的代碼行號(hào)
private $trace; // backtrace
private $previous; // previous exception if nested exception
public function __construct($message = null, $code = 0, Exception $previous = null);
final private function __clone(); // Inhibits cloning of exceptions.
final public function getMessage(); // 返回異常信息
final public function getCode(); // 返回異常代碼
final public function getFile(); // 返回發(fā)生異常的文件名
final public function getLine(); // 返回發(fā)生異常的代碼行號(hào)
final public function getTrace(); // backtrace() 數(shù)組
final public function getPrevious(); // 之前的 exception
final public function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
// Overrideable
public function __toString(); // 可輸出的字符串
}
?>
如果使用自定義的類(lèi)來(lái)擴(kuò)展內(nèi)置異常處理類(lèi),并且要重新定義構(gòu)造函數(shù)的話(huà),建議同時(shí)調(diào)用 parent::__construct() 來(lái)檢查所有的變量是否已被賦值。當(dāng)對(duì)象要輸出字符串的時(shí)候,可以重載 __toString() 并自定義輸出的樣式。
Note:
Exception 對(duì)象不能被復(fù)制。嘗試對(duì) Exception 對(duì)象復(fù)制 會(huì)導(dǎo)致一個(gè) E_ERROR 級(jí)別的錯(cuò)誤。
?php
/**
* 自定義一個(gè)異常處理類(lèi)
*/
class MyException extends Exception
{
// 重定義構(gòu)造器使 message 變?yōu)楸仨毐恢付ǖ膶傩?
public function __construct($message, $code = 0, Exception $previous = null) {
// 自定義的代碼
// 確保所有變量都被正確賦值
parent::__construct($message, $code, $previous);
}
// 自定義字符串輸出的樣式
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "A custom function for this type of exception\n";
}
}
/**
* 創(chuàng)建一個(gè)用于測(cè)試異常處理機(jī)制的類(lèi)
*/
class TestException
{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// 拋出自定義異常
throw new MyException('1 is an invalid parameter', 5);
break;
case self::THROW_DEFAULT:
// 拋出默認(rèn)的異常
throw new Exception('2 is not allowed as a parameter', 6);
break;
default:
// 沒(méi)有異常的情況下,創(chuàng)建一個(gè)對(duì)象
$this->var = $avalue;
break;
}
}
}
以上這篇基于PHP7錯(cuò)誤處理與異常處理方法(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- 解決thinkphp5未定義變量會(huì)拋出異常,頁(yè)面錯(cuò)誤,請(qǐng)稍后再試的問(wèn)題
- php異常處理捕獲錯(cuò)誤整理
- laravel 5異常錯(cuò)誤:FatalErrorException in Handler.php line 38的解決
- PHP中常見(jiàn)的錯(cuò)誤與異常處理總結(jié)大全
- php中的異常和錯(cuò)誤淺析
- 淺談PHP中的錯(cuò)誤處理和異常處理
- PHP錯(cuò)誤和異常處理功能模塊示例
- PHP中錯(cuò)誤與異常的日志記錄用法分析
- PHP中的錯(cuò)誤及其處理機(jī)制