2011-11-24 108 views
8

我正在寫PHP5中的腳本,需要某些文件的代碼。當一個文件不可用於包含時,首先會引發警告,然後是致命錯誤。如果不能包含代碼,我想打印自己的錯誤消息。如果requeire不起作用,是否有可能執行最後一條命令?以下沒有工作:如何在PHP中捕獲require()或include()的錯誤?

require('fileERROR.php5') or die("Unable to load configuration file."); 

使用error_reporting(0) Supressing所有錯誤消息只給出了一個白色的屏幕,沒有使用的error_reporting給出了PHP的錯誤,我不希望顯示。

回答

3

更好的方法是先在路徑上使用realpath。如果文件不存在,realpath將返回false

$filename = realpath(getcwd() . "/fileERROR.php5"); 
$filename && return require($filename); 
trigger_error("Could not find file {$filename}", E_USER_ERROR); 

你甚至可以創建自己需要的功能應用的namespace一個包裝PHP的需要功能

namespace app; 

function require_safe($filename) { 
    $path = realpath(getcwd() . $filename); 
    $path && return require($path); 
    trigger_error("Could not find file {$path}", E_USER_ERROR); 
} 

現在你可以在任何地方使用它在你的文件

namespace app; 

require_safe("fileERROR.php5"); 
+0

我絕對不知道爲什麼,但是你的代碼無法正常工作(產生誤報),何時在PHP CLI /控制檯中運行。即它停止腳本的執行,聲稱文件XYZ不存在,而它實際上確實存在 - 註釋掉你的代碼並直接進入include()可以正常工作,並且包含文件沒有錯誤。 – trejder

1

我會建議您在set_error_handler()函數的文檔中查看了最多的recent comment

它建議以下作爲捕捉致命誤差的方法(以及示例):

<?php 
function shutdown() 
{ 
    $a=error_get_last(); 
    if($a==null) 
     echo "No errors"; 
    else 
     print_r($a); 

} 
register_shutdown_function('shutdown'); 
ini_set('max_execution_time',1); 
sleep(3); 
?> 

我還沒有嘗試過的建議,但是這可能propably在其它致命錯誤場景中使用。

+0

雖然這可能有效,但它產生了很好的問題,如果這能在條件下工作,OP在問什麼?我相信大多數登陸這裏的人都在尋找一個解決方案,在那裏他們可以在非現有文件**上捕獲「require」,並繼續**腳本執行。能夠優雅地死去(即展示某些東西,但我希望最終還是腳本終止 - 這就是你的代碼似乎在做的事情)似乎並不適合許多場景。我認爲,腳本可以顯示任何想要的東西,如果它會死的。我想防止在不需要文件的情況下終止/終止。 – trejder

0

您需要使用include()。當在不存在的文件上使用Require()時,會產生致命錯誤並退出腳本,所以die()不會發生。 Include()僅引發警告,然後腳本繼續。

+0

您的答案要麼是特定於某個PHP版本,要麼是特定於某個「php.ini」配置。在我的配置(PHP 5.5.4)中,將'require'改爲'include'完全沒有區別。兩人都拋出醜陋的致命錯誤,我無法趕上。 – trejder

11

您可以使用set_error_handlerErrorException一起使用來完成此操作。

ErrorException頁的例子是:

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 

一旦你已經爲例外被處理的錯誤,你可以這樣做:

<?php 
try { 
    include 'fileERROR.php5'; 
} catch (ErrorException $ex) { 
    echo "Unable to load configuration file."; 
    // you can exit or die here if you prefer - also you can log your error, 
    // or any other steps you wish to take 
} 
?> 
+0

@SajnEvardsson php手冊將ErrorException的第三個參數設置爲$ errno,而不是第二個參數。 – Basit

+2

上面的例子直接從ErrorException docs(上面的鏈接)複製 - 在「官方」例子中,他們使用$ errno作爲$ code,而其他人(包括該頁面上的註釋)已經建議使用它作爲$ severity - note如果你喜歡,你可以將它用於兩者,或者兩者都不。 –

6

我只是用 'file_exists()':

if (file_exists("must_have.php")) { 
    require "must_have.php"; 
} 
else { 
    echo "Please try back in five minutes...\n"; 
}