2011-09-01 44 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块中。

相关问题