2013-05-13 58 views
0

我正在进行一个注册过程,以用户完成支付后大部分繁重工作完成的最终脚本结束。这些过程包括:嵌套多个尝试/捕获 - 是否有更好的方法?

  • 更新我们的销售DB几次
  • 使外部API后
  • 下载,修改并通过SFTP
  • 上传文件发送确认电子邮件

本质上有很多事情可能会单独失败,所有这些都是至关重要的,并依赖于前一个工作。我不只是要最终方法做这一切是沿

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

行,因为那是没有用的人。

我已经结束了所有这些最终处理过程的大量嵌套列表,现在已经有11个了 - 它确实有效,如果其中一个进程失败了,它会死掉,但是看到我刚刚假设的许多嵌套应该有更好的方式来处理所有这些过程。这是不好的做法吗?处理像这样的大量关键流程是否有更好的解决方案?

回答

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 
} 
+0

这是一个很好的观点。无论如何,我总是这样做,但没有考虑过只是多试一试。我以前没有这样工作过...谢谢。 – artparks 2013-05-13 18:34:38

1

在继续之前完成所有步骤对用户来说很重要吗?如果没有,您可以选择为单独的步骤创建作业,这些步骤通过beanstalkd等作业队列运行。这个想法是,你让一名工作人员一直在倾听beanstalkd。然后,当你需要它时,你可以发布一条消息给beanstalkd,指出需要完成的事情,比如'通过sfpt上传帐户所需的所有文件xyz'。然后当一项工作完成时,安排下一个工作。或者,如果由于例外而导致工作失败,请延迟工作;请告知beanstalk将作业取回并稍后再启动。例如,如果出现网络错误,请稍等一会,然后重试。 另一个优点是,通过卸载这种工作,用户体验会更好,因为他们不必等待整个过程的完成;这些都是在后台完成的。

+0

可能不值得这样做,因为它这让我觉得主要的好处是,如果有很多这些进程在运行sim但是这不会成为太多问题。尽管我可以想出一个更好的方法来重试任何在整个事情放弃之前失败的进程... – artparks 2013-05-13 18:37:41

相关问题