我正在测试负责记录消息的自定义异常类 LoggedException 。
但是它没有按预期工作,我的日志文件的目录结构是 logs / exceptions.log
我已经对文件的存在进行了某些检查,甚至检查了 error_log()的实现,它告诉文件被写入但是当我打开exceptions.log时,那里什么都没有我要写的信息是抛出的。
class LoggedException extends exception{
public function __construct($message,$code=0,$file='logs/exceptions.log')
{
if(file_exists($file)){
if(error_log($this->getMessage(),0,$file)){
echo "<br/>File Wirtten error message: ".$this->getMessage();
} else {
echo"<br/>cannot write";
}
} else {
echo "</br>No such file there";
}
}
}
class someClass{
private $prop="on";
public function checkState($device){
if(($this->prop)=="on"){
throw new LoggedException("The $device is ON");
}
else{
echo ("THE $device IS OFF");
}
}
}
$bulb=new SomeClass();
try{
$bulb->checkState("bulb");
}
catch(LoggedException $e){
echo "Exception message: ".$e->getMessage();
}
浏览器显示:
exceptions.log: (也未完整)
答案 0 :(得分:0)
查看手册以了解扩展课程Extending Exceptions
的正确方法<强>首先:强> 您缺少类构造函数
上的参数public function __construct($message,$code=0,$file='logs/exceptions.log')
第三个参数应该是Exception $previous = null
,如下所示: -
public function __construct($message, $code = 0,
Exception $previous = null,
$file='./logs/exceptions.log')
<强>第二强>
在您的班级parent::__construct($message, $code, $previous);
方法中执行自己的代码之前,请不要致电__construct
。
因此Exception类未正确初始化,但您尝试使用其属性,当然这些属性尚未加载。
<强>第三强>
在0
函数调用中将选项设置为error_log()
,该消息将转到标准PHP错误日志而不是您想要的日志。
所以将0
更改为3
,它将转到您在参数3中指定的文件。
第四:
您需要手动将自己的新行添加到写入日志的消息中。
将您的代码更改为
class LoggedException extends Exception{
public function __construct($message, $code = 0, Exception $previous = null, $file='./logs/exceptions.log')
{
parent::__construct($message, $code, $previous);
if(file_exists($file)){
if(error_log($this->getMessage() . PHP_EOL, 3, $file)){
echo "<br/>File Wirtten error message: ".$this->getMessage().PHP_EOL;
} else {
echo"<br/>cannot write";
}
} else {
echo "</br>No such file there";
}
}
}
如果运气不错,它会大致按照你的意图行事。