编程语言
首页 > 编程语言> > php symfony异常处理/错误处理

php symfony异常处理/错误处理

作者:互联网

在使用nusoap的symfony应用程序上工作(这是将soap work与php / symfony集成的最佳方法吗?)来进行信用卡付款.

我在下面简化了我的代码示例.

我正在努力的是处理异常的最佳方法.以下示例仅具有1个自定义异常(我的自定义异常应位于symfony的目录结构中的什么位置?(lib / exception?).)但是,当有几种不同类型的异常处理特定错误时会发生什么?具有20个奇数异常的try / catch块不是很优雅.

我也不确定应该在哪里投掷和接住.我需要设置一些用户闪烁以警告用户任何问题,因此我认为捕获应该在动作控制器中完成,而不是在处理soap调用的类中完成.

谁能告诉我可能要去哪里了吗?

我讨厌凌乱的代码/解决方案,并希望尽可能坚持DRY原则.我想我可能还缺少一些内置的symfony功能,这些功能可能对此有所帮助,但是每当我搜索时,我通常会找到适用于symfony 1.2的示例,而我使用的是1.4.

谢谢,有一些例子很好.

lib / soap_payment.class.php

class SoapPayment
{
  public function charge()
  {
    /*assume options are setup correctly for sake of example*/
    try
    {
      $this->call();
    }
    catch (SoapPaymentClientFaultException $e)
    {
      /* should this be caught here? */
    }
  }

  private function call()
  {
    $this->client->call($this->options);

    if ($this->client->hasFault())
    {
      throw new SoapPaymentClientFaultException();
    }
  }
}

apps / frontend / payment / actions / actions.class.php

class paymentActions extends sfActions
{
   public function executeCreate(sfWebRequest $request)
   {
     /* check form is valid etc */

     $soap_payment = new SoapPayment();

     try
     {
       $soap_payment->charge();
     }
     catch (SoapPaymentClientFaultException $e)
     {
       /* or throw/catch here? */
       $this->getUser()->setFlash('error', ...);

       $this->getLogger()->err(...);
     }   

     /* save form regardless, will set a flag to check if successful or not in try/catch block */
   }
}

解决方法:

Symfony的一个不太广为人知的功能是,异常可以管理响应中发送的内容.因此,您可以执行以下操作:

class SoapException extends sfException
{
  public function printStackTrace() //called by sfFrontWebController when an sfException is thrown
  {
    $response = sfContext::getInstance()->getResponse();
    if (null === $response)
    {
      $response = new sfWebResponse(sfContext::getInstance()->getEventDispatcher());
      sfContext::getInstance()->setResponse($response);
    }

    $response->setStatusCode(5xx);
    $response->setContent('oh noes'); //probably you want a whole template here that prints the message that was a part of the SoapException
  }
}

如果您需要对SOAP异常进行更干净的处理(例如设置闪存等),则可能必须捕获每个异常.这里的一个想法可能是创建一个通用的SoapException类,该类由更具体的SoapExceptions扩展,因此您不必捕获许多其他类型.上面的代码也可能是有用的回退机制.

最后,是的,您应该将自定义异常放在lib / exception中.

标签:error-handling,exception-handling,symfony1,php
来源: https://codeday.me/bug/20191209/2097039.html