2011-06-01 40 views
1

我覺得這有點奇怪。PHP 5.3異常完整性檢查 - PHP真的打印內部異常信息嗎?

我正在運行一個腳本,它運行一個程序。我將最新的輸出存儲在一個變量中。如果程序或腳本出於不同的原因在腳本中導致異常,我會捕獲異常,追加錯誤日誌並重新拋出它。上面的幾個級別我再次捕捉它,記錄總的消息,並重新推出它關閉腳本。

當PHP命令行終止時,它似乎只打印堆棧跟蹤中的內部異常消息,因爲沒有提及我的消息。它甚至說Uncaught「Exception」是我在測試時拋出的內部異常,而外部異常是自定義類型。 getMessage()按預期返回完整的消息。

PHP Fatal error: Uncaught exception 'Exception' with message 'This is a test error message.' in /home/x/Documents/project/file.php:14 

堆棧跟蹤:

難道我瘋了,這是預期的行爲?我應該去睡覺嗎?

UPDATE

在 「根」 級我有這樣的:

catch(Exception $e) 
    { 
     $access->logError($e->getMessage()); 
     print 'Actual error: ' . $e->getMessage() . "\n"; 
     print get_class($e); 
     throw $e;  
    } 

打印語句打印真正的消息,我期待,聚集。扔$Ë產生的內部異常的消息...... print get_class($e)打印CustomException ...

這是CustomException聲明:

class CustomException extends Exception 
{ 
    function __construct($message, $prev) 
    { 
     parent::__construct($message, -1, $prev); 
    } 
} 

這是如何使用它:

catch(Exception $e) 
{ 
    $message = $e->getMessage() . $logString; 
    $resultReporter->reportError($message); 
    $e = new CommandException($message, $e); 
    $throw e; 
} 
+0

你確定你確實在捕捉內部異常嗎?也許是一個愚蠢的問題,但它可能只是它實際上是內部處理的唯一例外。 – 2011-06-01 08:21:25

+0

@rudi這是一個很好的問題,請參閱我的更新。我期待着發現我犯了一些錯誤... – Max 2011-06-01 08:27:43

+0

剛看了你的更新,我有點困惑。你說你的外部異常是不同的類型,但你拋出原來的'Exception'?我想我可能錯過了一些東西!或者你根本不會在第一個地方拋出一個外部異常(這是你的代碼所暗示的)。 – 2011-06-01 08:34:07

回答

2

匝畢竟,我猜這是預期的行爲。

什麼PHP似乎做的是當它有機會顯示它時向後倒退異常堆棧。

看到下面的輸出:

Rudis-Mac-Pro:~ rudi$ php ex.php 
PHP Fatal error: Uncaught exception 'Exception' with message 'I'm an inner exception' in /Users/rudi/ex.php:3 
Stack trace: 
#0 {main} 

Next exception 'Exception' with message 'I'm the outer exception' in /Users/rudi/ex.php:6 
Stack trace: 
#0 {main} 

Next exception 'Exception' with message 'I'm the reeally outer exception' in /Users/rudi/ex.php:8 
Stack trace: 
#0 {main} 
    thrown in /Users/rudi/ex.php on line 8 

這是從相當基本的代碼生成:

<?php 
try { 
    throw new Exception("I'm an inner exception"); 
} catch(Exception $ex) { 
    try { 
     throw new Exception("I'm the outer exception", -1, $ex); 
    } catch(Exception $iex) { 
     throw new Exception("I'm the reeally outer exception", -1, $iex); 
    } 
} 

它可能做到這一點,使開發人員可以得到一個什麼樣實際上更好的視野發生,而不是抽象的。如果你仔細想想,有點意義^ _^

現在上牀睡覺;-)

+0

哈哈,如果最內在的例外是最詳細的(我的不是,這可能是一件壞事),那麼它會具有種種意義,但是如果它打印出「在發生錯誤時發生錯誤」這在「內部例外」中失敗了「。但是,謝謝。至少我不會做任何編程錯誤的事情。 – Max 2011-06-01 09:33:54