使用error_log()的PHP自定义异常

时间:2014-08-05 12:50:18

标签: php exception-handling error-log

我正在测试负责记录消息的自定义异常类 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();
}

浏览器显示: enter image description here

exceptions.log: (也未完整) enter image description here

1 个答案:

答案 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";
        }
    }

}

如果运气不错,它会大致按照你的意图行事。