我想在我的项目中使用一组基于 silex (silex.sensiolabs.org) 框架的自定义异常类。我更喜欢将错误消息写入函数"__construct"的日志文件中。有没有办法访问 MyException 类__construct函数中的$app['monolog']?我认为使用 $app 作为构造函数参数或全局变量并不优雅。
class MyException extends Exception
{
public function __construct($message = '')
{
parent::__construct($message);
//how to do?
$app['monolog']->addError($message);
}
}
如果你真的想,你可以让服务容器(Pimple)创建你的异常:
class MyException extends Exception
{
public function __construct($message = '', $monolog)
{
parent::__construct($message);
$monolog->addError($message);
}
}
// no share() => create new instance every time
$app['my_exception'] = function ($app) {
return new MyException($app['monolog']);
};
强烈建议不要这样做,您不希望将异常与日志记录逻辑耦合。更好的方法是添加一个记录它的错误处理程序。
例:
$app->get('/error', function () {
throw new MyException('A totally expected error happened.');
});
$app->error(function ($e) use ($app) {
if ($e instanceof MyException) {
$app['monolog']->addError($message);
}
});
如果错误处理程序未返回任何内容,则将调用其他错误处理程序,直到一个错误处理程序返回。
注意:如果您不知道,monolog 服务提供商已经记录了所有异常。