2011-09-01 76 views
0

比方說,我有代碼是這樣的:PHP:異常被捕獲後是否可以恢復try塊?

try{ 
    doTaskA(); 
    doTaskB(); 
    doTaskC(); 
} catch(MyException $e){ 
    fixMyException(); 
} 

當doTaskA()拋出MyException,我想要的程序要經過fixMyException(),然後返回並繼續執行doTaskB()和doTaskC()。可能嗎?

同樣的事情應該適用於其他任務,即所有doTaskA/B/C()可能會拋出相同的異常,並且我希望程序可以在每次執行fixMyException()後繼續執行未完成的任務。

在異常處理中有沒有像「繼續」或「恢復」功能的東西?

我檢查了PHP手冊,但似乎這樣的控制結構不存在。如果是這樣,設計可以做我想做的程序的最佳做法是什麼? (假設我在try塊中有超過10個任務)。

+0

您似乎錯過了這裏的例外。一個例外是非常好的例外,它保證中斷代碼的執行(並跳過'try'塊的其餘部分)並轉到異常處理程序。它不應該回去。 – NullUserException

+0

好吧,我也不確定我是否應該在這裏使用異常,我檢查了其他語言的異常處理,發現除了VisualBASIC之外,大多數主流語言都不允許「異常後回去」。所以我要求最好的做法來做我想做的事情:嘗試修復出錯的地方並重新執行指令。我期望的不限於異常處理機制。 – LazNiko

回答

4
function do_all_tasks($position=0) 
{ 
    $tasks = array('doTaskA', 'doTaskB', 'doTaskC', ...); 
    $size = count($tasks); 
    for ($i=$position; $i<$size; ++$i) 
    { 
    try 
    { 
     $func = $tasks[$i]; 
     $func(); 
    } 
    catch (Exception $e) 
    { 
     fixMyException(); 
     do_all_tasks($i+1); 
    }; 
    } 
} 

do_all_tasks(); 
1
try{ 
    doTaskA(); 
} catch(MyException $e){ 
    fixMyException(); 
} 

try{ 
    doTaskB(); 
} catch(MyException $e){ 
    fixMyException(); 
} 

try{ 
    doTaskC(); 
} catch(MyException $e){ 
    fixMyException(); 
} 
+0

你擊敗了我:P – Mike

1

這是怎麼回事比做

try { 
    doTaskA(); 
} catch (MyException $e) { 
    fixMyException(); 
} 
try { 
    doTaskB(); 
} catch (MyException $e) { 
    fixMyException(); 
} 
try { 
    doTaskC(); 
} catch (MyException $e) { 
    fixMyException(); 
} 
+0

謝謝邁克。但它看起來相當笨重(而不是DRY),即使只有3個任務...我需要處理超過10個這樣的任務...我想等着看其他人是否可以給出一個更好的答案。 – LazNiko

1

不,它是不可能有什麼不同。您需要將doTask*()函數中的每一個函數都放在它自己的try-catch塊中。