假设我有一个类在实例化时接受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"
请记住,这只是一个例子。真正的类可以接受一个非常大而复杂的数组。在这种情况下知道行号非常有用。
答案 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()方法。