__toString()不能抛出异常

时间:2014-11-28 13:59:46

标签: php spl

当我在index.php上访问浏览器时,出现以下错误 Fatal error: Method MyDirectoryIterator::__toString() must not throw an exception in /home/oussama/Desktop/CoursesTraining/OOPInPHP/index.php on line 0

当我尝试捕获异常时,我得到了同样的错误,所以我该怎么想 要知道异常是什么?

我的主目录包含两个文件index.php和MyDirectoryIterator.inc.php, 我使用composer来处理自动加载,这是源内容:

的index.php

<?php

require_once './vendor/autoload.php';


$files = new MyDirectoryIterator('../');
echo $files;

MyDirectoryIterator.inc.php

<?php


class MyDirectoryIterator {

    protected $_path;
    protected $_files;
    protected $_rfiles;

    function __construct($path)
    {
        $this->_path = __DIR__ . '/' . $path;
        $this->_files = new RecursiveDirectoryIterator($path);
        $this->_files->setFlags(
            FileSystemIterator::UNIX_PATHS |
            FileSystemIterator::SKIP_DOTS
        );

        $this->_rfiles = new RecursiveIteratorIterator($this->_files);
    }

    function __toString()
    {
        $output = '';

        foreach($this->_rfiles as $file)
        {
            $output .= $file . '<br />';
        }

        return $output;
    }
}

当我将__toString的内容复制到__construct时,代码按预期运行。 那么,当我从index.php执行echo $files时,为什么会出现错误?

任何想法。

1 个答案:

答案 0 :(得分:0)

这是我如何解决它,以防有人有同样的问题:

异常是由于权限被拒绝,访问列表中的一些文件,所以我只是在__toString方法中添加一个try catch块。

function __toString()
{
    $output = '';
    try {    
        foreach($this->_rfiles as $file)
        {
            $output .= $file . '<br />';
        }
    }
    catch(Exception $e) {}
    return $output;
}

奇怪的是我已经注意到了,当我从类中删除__toString()并将其逻辑添加到构造函数中时,为什么没有抛出异常?列出了所有文件,没有例外吗?