我想在我的项目中使用一组基于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);
}
}
答案 0 :(得分:2)
如果您真的想要,可以使用服务容器(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服务提供商已经记录了所有例外情况。