嵌套多个try/catch——有更好的方法吗?


Nesting multiple try/catches - is there a better approach?

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

  • 多次更新销售数据
  • 创建外部API post
  • 通过SFTP下载、修改和上传文件
  • 发送确认邮件

从本质上讲,有很多事情可能单独失败,所有这些都是至关重要的,并且依赖于前一个工作。我不希望最后的方法只在

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

因为那对任何人都没用。

我已经结束了一个巨大的嵌套列表的所有这些最终进程,现在是11深度-它确实工作,如果其中一个进程失败,它死亡与正确的异常,但看到这么多的巢我只是假设应该有一个更好的方式来处理所有这些进程。这种做法不好吗?是否有更好的解决方案来处理像这样的大量关键流程?

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

应该继承异常类

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
}