2015-12-07 37 views
1

我想PHP的異常系統會抓住所有的。但事實並非如此。php異常沒有引發致命錯誤,比如「class not exist」

try{ 
    $obj = new Asdfasdfasdf() 
} catch(Exception $e){ 
    trace(...something...) 
} 

不過,這並不趕上這樣那樣的錯誤,我已經搜查PHP文件,沒有說哪一種異常/錯誤的是追趕能在嘗試,catch子句。

那麼,我怎麼知道我的catch子句會捕捉哪種異常/錯誤呢?

P.S.

我終於明白從PHP引擎'錯誤'是不是使用土地代碼的'例外'。如果你想使用異常來處理引擎的錯誤,你應該手動包裝所有'錯誤'的異常。

+2

致命錯誤也不例外,例外情況是例外....我建議你閱讀有關[例外](http://www.php.net/manual/啓動en/language.exceptions.php) –

+0

致命錯誤無法捕捉。他們不會拋出任何東西。如果你想「捕捉」這種事情,你必須註冊一個錯誤處理程序/關閉腳本。 –

+0

@MarkBaker已閱讀文檔,請告訴我,在哪一行中,文檔說異常無法捕獲錯誤,以及哪種錯誤無法通過異常來捕獲 – lovespring

回答

1

如果要在類不存在的情況下拋出異常,可以使用class_exists()

一個簡單的例子可能看起來像:

function createClass($class) 
{ 
    if (!class_exists($class)) { 
     throw new Exception(
      sprintf('Class %s does not exist', $class) 
     ); 
    } 

    return new $class; 
} 

try { 
    $asdfasdfasdf = createClass('Asdfasdfasdf'); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

從我的經驗,大多數PHP框架拋出某種異常時,未發現了一類 - 例如,Symfony2中拋出一個ClassNotFoundException。這就是說,我不知道你是否可以「捕捉」到,這可能只是一種發展援助。

PHP 7剛剛發佈,根據我對規範的理解,您將能夠趕上fatal error作爲EngineException。我不知道它是否適合你的例子。我還沒有測試過,因爲我還沒有安裝PHP 7。我在一個在線REPL上嘗試了PHP 7的alpha版本,看起來它不起作用。

但是爲了完整性,這裏是從RFC一個例子:

function call_method($obj) { 
    $obj->method(); 
} 

try { 
    call_method(null); // oops! 
} catch (EngineException $e) { 
    echo "Exception: {$e->getMessage()}\n"; 
} 

// Exception: Call to a member function method() on a non-object 

在任何情況下,如@MarkBaker和@MarcB在問題的評論中指出,你不能「趕」在以前的版本fatal error PHP。

希望這有助於:)

+1

謝謝你!它真的幫助我明白,在PHP中,錯誤和異常是兩個不同的系統,如果你想捕獲「錯誤」,你必須手動包裝「錯誤」在例外 – lovespring

+0

沒有問題@lovespring :) –

相關問題