亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你如何在 PHP 7+ 中捕獲可恢復的錯誤?

你如何在 PHP 7+ 中捕獲可恢復的錯誤?

PHP
慕工程0101907 2021-12-24 15:57:06
讓我認為可以捕獲可恢復的錯誤,但事實并非如此,如下所示:<?php$_SERVER['TEST'] = new stdClass;try {    phpinfo();} catch (\Throwable $e) {}如果您運行該代碼,您將得到以下輸出:$_SERVER['argc'] => 1$_SERVER['TEST'] =>Recoverable fatal error: Object of class stdClass could not be converted to string in /Users/username/zzz.php on line 6很明顯,“發出”了一個錯誤,但沒有拋出一個錯誤,除非我誤解了什么?
查看完整描述

1 回答

?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

并非所有錯誤都轉換為ThrowablePHP 7 中的錯誤。


實際上,文檔說:


大多數錯誤現在通過拋出錯誤異常來報告。


(強調我的)。大多數 !== 全部。


有些錯誤仍然無法捕捉。


有趣的是,在 PHP 7.1 發布之前,您習慣于說“可捕獲的致命錯誤”而不是“可恢復的致命錯誤”的錯誤消息。


這被報告為錯誤,但開發人員實施的解決方案是將錯誤字符串從Catchable更改為Recoverable以消除誤解。


在您正在測試的特定情況下,似乎phpinfo()引發 arecoverable error而不是拋出 an Error,因此您無法以這種方式捕獲它是有道理的。


盡管如此,并不是所有的希望都破滅了。


您可以做的是通過實現您自己的錯誤處理程序將所有錯誤轉換為異常。ErrorException 文檔中描述了一個示例:


function exception_error_handler($severity, $message, $file, $line) {

    if (!(error_reporting() & $severity)) {

        // This error code is not included in error_reporting

        return;

    }

    throw new ErrorException($message, 0, $severity, $file, $line);

}


set_error_handler("exception_error_handler");

這個例子的巧妙之處在于它考慮了您的錯誤報告設置,因此只有在您的設置下報告的錯誤才會作為異常實際拋出。否則,什么都不會發生。


測試你的代碼:


<?php

function exception_error_handler($severity, $message, $file, $line) {

    if (!(error_reporting() & $severity)) {

        // This error code is not included in error_reporting

        return;

    }

    throw new ErrorException($message, 0, $severity, $file, $line);

}

set_error_handler("exception_error_handler");


$_SERVER['TEST'] = new stdClass;


try {

    phpinfo(INFO_VARIABLES);

} catch (\Throwable $e) {echo 'CAUGHT!!!!!!';}

打印以下輸出:


$_SERVER['TERM_SESSION_ID'] => w0t1p0:xxx-cxx-xxxxxxx-xxxxx

$_SERVER['SSH_AUTH_SOCK'] => /private/tmp/com.apple.launchd.xxxxxxxx/Listeners

$_SERVER['LC_TERMINAL_VERSION'] => 3.3.2

....

$_SERVER['argc'] => 1

$_SERVER['TEST'] =>

CAUGHT!!!!!!%


查看完整回答
反對 回復 2021-12-24
  • 1 回答
  • 0 關注
  • 241 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號