gpt4 book ai didi

php symfony 异常处理/错误处理

转载 作者:搜寻专家 更新时间:2023-10-31 20:55:06 24 4
gpt4 key购买 nike

正在开发一个使用 nusoap(这是将 soap work 与 php/symfony 集成的最佳方法吗?)的 symfony 应用程序来接受信用卡付款。

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

我正在苦苦挣扎的是处理异常的最佳方式。下面的示例只有 1 个自定义异常(我的自定义异常应该位于 symfony 的目录结构中的什么位置?(lib/exception?))但是当有几种不同类型的异常处理特定错误时会发生什么?有 20 个奇怪的异常的 try/catch block 不是很优雅。

我也不确定我应该在哪里投球和 catch 。我需要设置一些用户闪烁来提醒用户任何问题,所以我认为捕获应该在 Action Controller 中完成,而不是在处理 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 中。

关于php symfony 异常处理/错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3559543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com