อัปเดต: นี่ไม่ใช่ข้อผิดพลาดร้ายแรงที่จับได้อีกต่อไปใน php 7 แต่ "ข้อยกเว้น" จะถูกโยนทิ้ง เป็น "ข้อยกเว้น" (ในคำพูดที่ทำให้ตกใจ) ที่ไม่ได้มาจากข้อยกเว้นแต่ข้อผิดพลาด ; มันยังคงเป็นThrowableและสามารถจัดการได้ด้วยบล็อก try-catch ตามปกติ ดูhttps://wiki.php.net/rfc/throwable-interface
เช่น
<?php
class ClassA {
public function method_a (ClassB $b) { echo 'method_a: ', get_class($b), PHP_EOL; }
}
class ClassWrong{}
class ClassB{}
class ClassC extends ClassB {}
foreach( array('ClassA', 'ClassWrong', 'ClassB', 'ClassC') as $cn ) {
try{
$a = new ClassA;
$a->method_a(new $cn);
}
catch(Error $err) {
echo "catched: ", $err->getMessage(), PHP_EOL;
}
}
echo 'done.';
พิมพ์
catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassA given, called in [...]
catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassWrong given, called in [...]
method_a: ClassB
method_a: ClassC
done.
คำตอบเก่าสำหรับเวอร์ชันก่อน php7:
http://docs.php.net/errorfunc.constantsพูดว่า:
E_RECOVERABLE_ERROR (จำนวนเต็ม)
ข้อผิดพลาดร้ายแรงที่ตรวจจับได้ แสดงว่าอาจมีข้อผิดพลาดที่เป็นอันตรายเกิดขึ้น แต่ไม่ได้ทำให้เครื่องยนต์อยู่ในสถานะที่ไม่เสถียร หากข้อผิดพลาดไม่ถูกจับโดยจุดจับที่ผู้ใช้กำหนด (ดูเพิ่มเติมที่set_error_handler () ) แอปพลิเคชันจะยกเลิกเนื่องจากเป็น E_ERROR
ดูเพิ่มเติม: http://derickrethans.nl/erecoverableerror.html
เช่น
function myErrorHandler($errno, $errstr, $errfile, $errline) {
if ( E_RECOVERABLE_ERROR===$errno ) {
echo "'catched' catchable fatal error\n";
return true;
}
return false;
}
set_error_handler('myErrorHandler');
class ClassA {
public function method_a (ClassB $b) {}
}
class ClassWrong{}
$a = new ClassA;
$a->method_a(new ClassWrong);
echo 'done.';
พิมพ์
'catched' catchable fatal error
done.
แก้ไข: แต่คุณสามารถ "ทำให้" เป็นข้อยกเว้นที่คุณสามารถจัดการได้ด้วยบล็อกลองจับ
function myErrorHandler($errno, $errstr, $errfile, $errline) {
if ( E_RECOVERABLE_ERROR===$errno ) {
echo "'catched' catchable fatal error\n";
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
return false;
}
set_error_handler('myErrorHandler');
class ClassA {
public function method_a (ClassB $b) {}
}
class ClassWrong{}
try{
$a = new ClassA;
$a->method_a(new ClassWrong);
}
catch(Exception $ex) {
echo "catched\n";
}
echo 'done.';
ดู: http://docs.php.net/ErrorException
E_RECOVERABLE_ERROR
) ซึ่งถูกจับโดยเริ่มต้นด้วย PHP 7 ..