2015-10-10 32 views
1

我正在通過針對Exception類的PHP文檔,並且我對OOP PHP非常陌生,因此使用PHP預定義和SPL類進行異常處理。異常流理解PHP

雖然我無法得到那裏列出的例子的執行流程。

<?php 

class MyCustomException extends Exception {} 

function doStuff() { 
    try { 
     throw new InvalidArgumentException("You are doing it wrong!", 112); 
    } catch(Exception $e) { 
    throw new MyCustomException("Something happened", 911, $e); 
    } 
} 


try { 
    doStuff(); 
} catch(Exception $e) { 
do { 
    printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e- >getCode(), get_class($e)); 
    } while($e = $e->getPrevious()); 
} 
    ?> 

這是我迄今爲止的理解。

  1. 解析器解釋一個函數併爲它分配內存。
  2. 它進入try塊並執行dostuff();
  3. 這之後是什麼......以及輸出如何按照如下所示的順序發生如何不明確,即MyCustomException首先出現。

/home/bjori/ex.php:8 Something happened (911) [MyCustomException] /home/bjori/ex.php:6 You are doing it wrong! (112) [InvalidArgumentException]

請人流下了燈就可以了!非常感謝 !

+0

您捕獲一個異常,它會停止它的傳播。然後再拋出另一個異常(一個與另一個異常相關的事實是無關緊要的),然後再傳播。你期望會發生什麼? –

回答

0

doStuff();您正在投擲第一個InvalidArgumentException(第一個例外),並且在doStuff()中被捕獲。並且您將其再次丟棄爲MyCustomException(第二個例外)。所以在外層的try和catch塊最後拋出的異常是MyCustomException因此以前異常/是InvalidArgumentException

http://php.net/manual/en/exception.getprevious.php

返回先前的異常(異常的第三個參數:: __構建體())。

希望有所幫助。