在 file1.php 中:
set_error_handler('my_error_handler');
set_exception_handler('my_exception_handler');
function my_error_handler($errNo, $errStr, $errFile, $errLine, $whatever = null){
// here ErrFile and $errLine are correct only for native funcs...
throw New ErrorException($errStr, 0, $errNo, $errFile, $errLine);
}
function my_exception_handler($exception){
print $exception->getLine(); // correct only for native functions
print $exception->getFile(); // correct only for native functions
}
在 file2.php 中,一个示例函数定义:
function foo($requiredArg){
}
在 file3.php 中,调用 foo:
foo();
产生:
Missing argument 1 for foo(), called in file3.php on line 2 and defined...
消息是正确的,但是当我尝试获取文件并使用 $exception->getFile()
和 $exception->getLine()
时(在我的异常处理程序),我得到了定义 foo() 的文件和行,而不是它被调用的地方...
但是使用 native PHP 函数,我可以获得调用该函数的文件和行(这就是我想要的)。
最佳答案
它简单地归结为最接近的第一个。
当您使用核心或内置函数时,它们的定义包含在 PHP 的核心中。这意味着与用户定义的函数相比,函数的定义不可用,用户定义的函数的定义很容易获得。
如果您在引用您的用户的 exception_handler
函数中运行 debug_backtrace();
或 $exception->getTrace();
- defined functions 的错误,你会先看到函数的定义,然后再看到函数的调用。如果您调用内部函数,您将只能看到调用行,因为 PHP 无法告诉您脚本或包含的文件中定义了内部函数的代码行,因为它是在核心中定义的。
这是错误处理的操作顺序。如果您想获得调用该函数的实际行,您可以查看跟踪并获取第二个数组对行号的引用。
关于php - ErrorException 返回错误的文件和行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11583758/