PHP - 带行号的自定义异常消息

时间:2015-01-15 21:30:10

标签: php exception-handling

假设我有一个类在实例化时接受SomeClass数组,例如:

class ConfigurableClass
{
    public function __construct( array $config = array() )
    {
        foreach( $config as $param )
        {
            if( !$param instanceof SomeClass )
            {
                $type = gettype($param);
                $line = ? // How can I retrieve this?
                throw new Exception("ConfigurableClass config parameters must be of type SomeClass, $type given in line $line");
            }
        } 
    }
}

让我们说这个类在另一个文件中实例化,其中一个数组的类型错误,例如:

$instance = new ConfigurableClass(array(
   new SomeClass(),
   new SomeClass(),
   new SomeClass(),
   'Ooops!',       // String type, line 5
   new SomeClass()
));

如何抛出错误消息,指定插入了错误对象类型的行号? 在这种情况下,相应的消息应为:

"ConfigurableClass config parameters must be of type SomeClass, string given in line 4"

请记住,这只是一个例子。真正的类可以接受一个非常大而复杂的数组。在这种情况下知道行号非常有用。

1 个答案:

答案 0 :(得分:1)

无法确定行(在您的情况下为5),因为它是由调用者指令的末尾给出的,即分号所在的位置(在您的情况下为7)。

但是,您可以通过显示行号和错误的参数编号来获得良好的近似值。

<?php
class ConfigurableClass
{
    public function __construct( array $config = array() )
    {
        $counter = 0;

        foreach( $config as $param )
        {
            if( !$param instanceof SomeClass )
            {
                $type = gettype($param);
                $line = debug_backtrace()[0]['line'];
                throw new Exception("ConfigurableClass config parameter[$counter] must be of type SomeClass, $type given in line $line");
            }

            $counter++;
        } 
    }
}

该消息将类似于:

致命错误:未捕获的异常&#39;异常&#39;使用消息&#39; ConfigurableClass配置参数[3]必须是SomeClass类型,在第12行的C:\ your \ folder \ origin_file.php中给出的字符串&#39;在第15行的C:\ your \ folder \ ConfigurableClass.php

如果在消息中要避免引用ConfigurableClass文件和行,则必须创建自己的派生异常类并覆盖__toString()方法。