0

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

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

本质上,有很多事情可能会单独失败,所有这些都很关键,并且依赖于前一个工作。我不只是希望最终的方法来完成这一切

try {
    $Signup->doEverything();
}
catch( Exception $e ) {
    echo "Something went wrong"
}

因为这对任何人都没有用。

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

4

2 回答 2

1

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

于 2013-05-13T18:12:55.770 回答
0

您应该对异常类进行子类化

IE

class ExceptionOne extends Exception
{

...

}

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

IE

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
}
于 2013-05-13T18:20:04.943 回答