嵌套多个尝试/捕获 - 是否有更好的方法?

时间:2013-05-13 18:06:50

标签: php try-catch

我正在进行一个注册过程,该过程以用户付款后完成大部分繁重工作的最终脚本结束。这些过程包括:

  • 多次更新我们的销售数据库
  • 制作外部API帖子
  • 通过SFTP下载,修改和上传文件
  • 发送确认电子邮件

基本上,有许多事情可能会单独失败,所有这些都是至关重要的,并依赖于之前的工作。我不仅希望最终方法能够按照

的方式完成所有这些操作
try {
    $Signup->doEverything();
}
catch( Exception $e ) {
    echo "Something went wrong"
}

因为这对任何人都没用。

我最终得到了一个包含所有这些最终进程的大量嵌套列表,现在已经很深了 - 它确实有效,如果其中一个进程失败就会死掉正确的异常,但看到这么多嵌套我只是假设在那里应该是处理所有这些过程的更好方法..这是不好的做法吗?是否有更好的解决方案来处理像这样的大量关键流程?

2 个答案:

答案 0 :(得分:1)

用户在继续之前完成所有步骤是否重要?如果没有,您可以选择为单独的步骤创建作业,这些步骤通过beanstalkd等作业队列运行。这个想法是让你的工作人员一直在听beanstalkd。然后,当您需要它时,您可以向beanstalkd发送消息,指出需要执行的操作,例如“通过sfpt上传帐户xyz所需的所有文件”。然后,当工作完成后,安排下一个工作。或者,如果作业因异常而失败,则延迟作业;告诉beanstalk去取回工作,稍后再开始。例如,如果出现网络错误,请等待一分钟再重试。 另一个优点是通过卸载这种工作,用户体验会更好,因为他们不必等待整个过程完成;这一切都是在后台完成的。

答案 1 :(得分:0)

您应该对异常类

进行子类化

class ExceptionOne extends Exception
{

...

}

然后你可以只有一个try/catch

try
{

   ... i.e. throw an appropriate exception according to the problem

}
catch (ExceptionOne ex)
{
   ...
}
catch (ExceptionTwo ex)
{
   ...

}

etc.

catch (Exception ex)
{
   ... For a catch all
}