2011-04-02 127 views
6

這是一個簡單的問題谷歌似乎並沒有解決一個小時。你如何在PHP中捕獲失敗的包含?對於以下代碼:嘗試抓住一個失敗的包括

try { 
    include_once 'mythical_file'; 
} catch (Exception $e) { 
    exit('Fatal'); 
} 

echo '?'; 

隨着mythical_file不存在,我得到輸出'?'。我知道PHP不能捕獲失敗的需求,因爲它會觸發警告錯誤,但在這裏?發現失敗的最佳方法是什麼?例如,下面的工作:

(include_once 'unicorn') or exit('!'); 

,但它並沒有觸發異常,所以我不能檢索文件,行和堆棧環境。

+0

你可能想看看[register_s hutdown_function()](http://php.net/manual/en/function.register-shutdown-function.php)與[error_get_last()](http://php.net/manual/en/function)結合使用。錯誤得到-last.php)。應該能夠檢索文件,行等 – billrichards 2015-06-26 00:08:32

回答

2

您可以使用require_once代替include_once

+0

嗯,我想我將不得不關閉票,因爲它顯然在我的一些虛擬主機和其他沒有(使用require會觸發500錯誤)的作品。無論如何,感謝您的幫助! – fabjoa 2011-04-02 06:56:25

+1

@fabjoa,@Gaurav - 我們這裏沒有「門票」,所以沒有什麼可關閉的。 – Dori 2011-04-03 06:24:49

1

includeinclude_once觸發警告(E_WARNING)requirerequire_once觸發錯誤(E_COMPILE_ERROR)。所以你應該使用requirerequire_once

php.net報價:

「需要()是相同的包括() 除在失敗時它也將 產生致命 E_COMPILE_ERROR水平 誤差換言之,它將停止。 腳本,而包括()只 發出警告(E_WARNING),這 允許腳本繼續。「

+0

除非你絕對必須使用'_once',否則會影響性能。 – transilvlad 2014-04-11 18:11:13

+0

@tntu你能解釋一下嗎?我的理解是,當文件已經被包含時使用require或include會比使用_once浪費更多的資源。謝謝! – billrichards 2014-11-06 17:07:14

+0

@billrichards如果你編寫好的代碼,你永遠不應該遇到兩次包含同一個文件的情況。解釋性能差異是什麼在這裏解釋:http://stackoverflow.com/questions/186338/why-is-require-once-so-bad-to-use – transilvlad 2014-11-07 09:39:25