Php 处理Symfony应用程序中的MySQL错误

Php 处理Symfony应用程序中的MySQL错误,php,error-handling,symfony1,symfony-1.4,Php,Error Handling,Symfony1,Symfony 1.4,我想知道从Symfony应用程序处理MySQL异常的最佳方法是什么,例如,从普通环境(不是开发环境)处理MySQL异常: 哎呀!服务器返回“500”内部服务器时出错 错误” 这在_dev的翻译如下: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '343434' for key 'rut' 您如何处理此类错误,以便向最终用户显示消息或更友好的内容 您最好创建一个自定义错误页面,并可以选择创建一个自定义

我想知道从Symfony应用程序处理MySQL异常的最佳方法是什么,例如,从普通环境(不是开发环境)处理MySQL异常:

哎呀!服务器返回“500”内部服务器时出错 错误”

这在_dev的翻译如下:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '343434' for key 'rut'

您如何处理此类错误,以便向最终用户显示消息或更友好的内容

您最好创建一个自定义错误页面,并可以选择创建一个自定义错误处理程序来提醒您错误

首先,创建一个自定义错误页面,只需在
/path/to/project/config/error/error.html.php
中创建一个文件。Symfony将自动使用您的错误页面,而不是它自己的错误页面(如果存在)

如果您想更高级一点,可以添加一个事件侦听器来处理未捕获的异常。要执行此操作,请编辑
/path/To/project/config/ProjectConfiguration.class.php
,并添加如下侦听器:

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    //...
    $this->dispatcher->connect('application.throw_exception', array($this, 'listenToException'));
  }

  public function listenToException(sfEvent $event)
  {
    $handler = new myExceptionHandler($event);
    $handler->doSomethingHere();
  }
}
然后,您只需创建自己的
myExceptionHandler
类,该类不包含
sfEvent$event
参数。你可以在这里做任何你想做的事,我更喜欢给自己发一封电子邮件,告诉我发生了一个错误

下面是一个简单的例子:

class myExceptionHandler
{
  protected $event;

  public function __construct(sfEvent $event)
  {
    $this->event = $event;
  }

  protected function getMailer()
  {
    return sfContext::getInstance()->getMailer();
  }

  public function notify()
  {
    $subject = 'Uncaught Exception';
    $body = $this->event->getSubject();

    $mailer = $this->getMailer();
    $mailer->composeAndSend('root@yourserver.com', 'you@youremail.com', $subject, $body);
  }
}

在本例中,您只需从项目配置中调用
$handler->notify()
,它就会通过电子邮件向您发送堆栈跟踪。您还可以包括其他信息,如
$\u SERVER
变量等。

您使用的是ORM吗?@meijuh是的,Symfonywell条令附带的条令会引发异常,以便您可以在控制器中尝试/捕获它。请记住,您确实希望尽快了解这种类型的错误(如在您的示例中,缺少测试或数据库模式不正确)。你需要做的几件事:1.定制500错误页面;2.设置电子邮件通知,以便您知道何时发生紧急事件;3.您也可以为条令例外添加额外的try/catch,但请记住记录或发送电子邮件,以便您了解。@François现在我可以使用try/catch,但正如您所说,这不是最好的,您能解释一下您的回答吗?我在谷歌上搜索了第二步(2),没有找到任何相关信息。请查找sfErrorNotifier2Plugin和sfErrorHandlerPlugin,它们工作得很好。无需为此编写自己的代码。