2012-09-13 31 views
-1

我得到了一個產生錯誤的概率爲50:50的代碼。它全部在類對象中完成。對象中的任何方法都可能產生錯誤。我該怎麼做才能讓方法棧中深處的函數產生一個錯誤,以便返回到第一個函數run?如何立即結束堆棧執行(PHP)?

像這樣: 1.通話功能1 2.功能1調用函數2 3.功能2調用功能3 4.功能3產生一個錯誤,並提供了陣列與 錯誤定義權FUNCTION1

我知道例外是正確的(用try-catch塊封裝一個函數),但是我仍然無法使它在3個函數深度堆棧中捕獲Exception。我怎麼做?

+0

異常確實是你想要的,它們可以在任何級別上工作。向我們展示您的代碼,以便我們可以告訴您爲什麼它不適合您。 – deceze

+0

在某處深處拋出異常並在更高級別捕獲它。你從那得到什麼? – PeeHaa

+0

另外官方手冊有一些例子,你可能想看看:http://php.net/manual/en/language.exceptions.php – PeeHaa

回答

0

異常是這樣做的正確方法。捕捉異常(普通類)是一種不好的做法。

您應該拋出具體/自定義異常。

http://php.net/manual/en/spl.exceptions.php,改變你的throw更多especific和具體例外

避免

throw new Exception('foo'); 

相反

throw new RuntimeException('foo'); 
+0

邊界線「不是一個答案」我會說,因爲它是呼應什麼OP已經知道 – PeeHaa

+0

有時直接的答案不是解決方案。在這種情況下,他的問題是設計缺乏。 – Maks3w

+0

我發現通過查看OP的問題真的很難分辨出來。 – PeeHaa

-2

只使用try的水平,這應該捕獲異常,並離開其他的不變。 EX:

try{ 
function1(); 
} 
catch(Exception e){ 
// bla bla 
} 

正如有人說,傳播例外,直到他們被發現,或者在崩潰:)。

+2

你爲什麼要那樣做?無論如何,異常都會冒出來。根本不需要這樣做。 – PeeHaa

+0

太痛苦了,但我會考慮用這個 – user25662

+0

認爲這很容易理解(因爲op寫了'class project')。他可以在想要捕捉異常的級別使用它。 – CosminO

2

你有什麼試過?它很簡單,真的:

<?php 

function function1() { 
    try { 
     function2(); 
    } 
    catch(Exception $e) { 
     // Exception from function4 bubbles up. 
    } 
} 

function function2() { 
    function3(); 
} 

function function3() { 
    function4(); 
} 

function function4() { 
    throw new Exception(); 
} 
+0

這將要求在我的機器上發現'未捕獲的異常' – user25662

+0

Ooop,突然開始工作,不知道我做錯了什麼:D – user25662