【问题标题】:Php Custom Exceptions with error_log()带有 error_log() 的 PHP 自定义异常
【发布时间】:2014-09-28 03:25:10
【问题描述】:

我正在测试一个负责记录消息的自定义异常类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:(也不完整)

【问题讨论】:

    标签: php exception-handling error-log


    【解决方案1】:

    查看手册了解扩展类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')
    

    第二:

    在类的 __construct 方法中编写自己的代码之前,不要调用 parent::__construct($message, $code, $previous);

    所以 Exception 类没有正确初始化,但是您尝试使用它的属性,当然这些属性还没有加载。

    第三:

    error_log() 函数调用中将选项设置为0,消息将转到标准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";
            }
        }
    
    }
    

    如果运气好的话,它会大致按照您的意图进行。

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 2020-05-17
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2023-03-21
      • 2011-06-11
      • 2012-01-17
      • 1970-01-01
      相关资源
      最近更新 更多