如果您正在處理敏感資料,而且不希望例外記錄詳細資訊(例如當您拋出它們時的變數內容),您可能會沮喪地尋找組成一般堆疊追蹤輸出的部分,以便您可以保留其可讀性,但只更改一些內容。在這種情況下,這可能會對您有所幫助
<?php
function exceptionHandler($exception) {
$traceline = "#%s %s(%s): %s(%s)";
$msg = "PHP 嚴重錯誤:未捕獲的異常 '%s',訊息為 '%s',發生於 %s:%s\n堆疊追蹤:\n%s\n拋出於 %s 行的 %s";
$trace = $exception->getTrace();
foreach ($trace as $key => $stackPoint) {
$trace[$key]['args'] = array_map('gettype', $trace[$key]['args']);
}
$result = array();
foreach ($trace as $key => $stackPoint) {
$result[] = sprintf(
$traceline,
$key,
$stackPoint['file'],
$stackPoint['line'],
$stackPoint['function'],
implode(', ', $stackPoint['args'])
);
}
$result[] = '#' . ++$key . ' {main}';
$msg = sprintf(
$msg,
get_class($exception),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine(),
implode("\n", $result),
$exception->getFile(),
$exception->getLine()
);
error_log($msg);
}
?>
如果你不喜歡 sprintf() 或重複呼叫 $exception->getFile() 和 $exception->getLine(),當然可以隨意替換,這裡只是將各部分組合起來而已。