2024年波兰PHPC

错误处理函数

另请参见

另请参见syslog().

目录

添加备注

用户贡献的笔记9条注释

tracerdx-dot-com上的tracerdx
18年前
我一直看到错误类型/error-nums作为数组的限定列表;在用户注释和手册本身中。例如,在此手动条目的示例中,当尝试在错误报告中分离变量跟踪的行为时:

<?php(电话)//...

//将保存var跟踪的一组错误
$用户错误=数组(用户错误,用户警告(_U),用户注意事项);

//稍后。。。

如果(阵列中(_A)($错误编号,$用户错误)) {
//...无论什么
}

//...?>

我的印象是,PHP错误代码值中的位标志值。按位屏蔽不是更好吗?所以我建议一个稍微好一点的方法:
<?php(电话)//...

$用户错误=用户错误(_E)|用户警告(_U)|_用户_通知;

//...废话。。。

如果($错误编号&$user_errors(用户错误)) {
//...无论什么
}

//...?>
或者对于那些不喜欢在if语句中使用整数作为条件的人:

<?php(电话)
如果(($错误编号&$用户错误) >0) {
//...无论什么
}
?>

我认为这比使用_yet另一个_array()构造和in_array()要高效得多。

如果我错了,并且E_*常量不应该以这种方式使用(例如,常量不能保证是按位的,这很奇怪,因为它们是在php.ini文件中设置的),那么请删除我。我只是不明白为什么在按位比较有效时应该使用数组,考虑到按位方法应该更加有效。
gmail网站上的shawing
19年前
尽管root用户写入文件“error_log”和“access_log“,但Apache用户必须拥有“error_log=filename”引用的文件,否则将不会写入任何日志条目。

; 来自php.ini
; 将错误记录到指定的文件。
error_log=/usr/local/apache/logs/php.errors

[root@www日志]$ls-l/usr/local/apache/logs/php.errors
-rw-r--r--1 nobody root 27K 1月27日16:58 php.errors
史蒂芬
17年前
如果将PHP用作Apache模块,则默认行为可能是将PHP错误消息写入Apache的错误日志。这是因为error_log.ini指令可能被设置为“error_log”,它也是Apache错误日志的名称。我认为这是故意的。

但是,如果愿意,只需为error_log设置不同的值,就可以将Apache错误与PHP错误分开。我把我的写在/var/log文件夹中。
在se-dot-linux-dot org上的ptah
19年前
仅PHP5(仅用PHP5.0测试)。

如果出于某种原因,您更喜欢异常而不是错误,并且让您的自定义错误处理程序(set_error_handler)将错误包装为异常,那么您必须小心使用脚本。

因为如果您不只是调用异常处理程序,而是抛出异常,并且有一个自定义异常处理程序(set_exception_handler)。当异常处理程序内部触发错误时,您将得到一个奇怪的错误:
“致命错误:在第0行的未知中引发了没有堆栈帧的异常”

这个错误没有特别的信息,是吗?:)

下面的示例将导致此错误。
<?php(电话)
PHP错误异常延伸例外情况
{
私有的
$上下文=无效的;
公共职能
__构造
($代码,$条消息,$文件,$行,$上下文=无效的)
{
起源::__构造($消息,$代码);
$这个->文件=$文件;
$这个->线=$行;
$这个->上下文=$上下文;
}
};

功能
错误处理程序($代码,$消息,$文件,$行) {
抛出新的
PHP错误异常($代码,$消息,$文件,$行);
}

功能
异常处理程序(例外$e)
{
$个错误=数组(
用户错误=>“用户错误”,
用户警告(_U)=>“用户警告”,
_用户_通知=>“用户通知”,
);

回声
$个错误[美元->获取代码()]。': '.美元->获取消息().“在”.美元->获取文件().
'在线'.美元->获取线路().“\n”;
回声
美元->获取跟踪AsString();
}

设置错误处理程序('错误处理程序');
设置异常处理程序('异常处理程序');

//引发带有/unkown/error代码的异常。
抛出新的例外(“foo”,0);
?>

然而,有一个简单的修复方法,因为它的唯一原因是代码太草率。
与之类似,直接从error_handler调用exception_handlers,而不是抛出异常。它不仅解决了这个问题,而且速度更快。虽然这将导致打印“常规”未处理的异常,并且如果只打算显示“设计的”错误消息,这并不是最终的解决方案。

那么,该怎么办呢?确保exception_handlers中的代码不会导致任何错误!在这种情况下,一个简单的isset()就可以解决这个问题。

尊敬的C-A B。
dgrmm点网的mortonda
17年前
请注意,这里列出的示例代码每次调用时都会调用date()。如果您有一个经常调用自定义错误处理程序的复杂源代码库,那么最终可能会花费大量时间。我对som代码运行了一个分析器,发现50%的时间都花在这个错误处理程序的date函数上。
theotek AT nonwhere DOT组织
17年前
完全可以在错误处理函数中使用debug_backtrace()。这里,请看一下:

<?php(电话)
设置错误处理程序
(“errorHandler”);

功能
错误处理程序($错误编号,$errstr(错误字符串),$err文件,$errline(错误代码),$errcontext(错误上下文))
{
回声
“进入”.__功能__.'第行的()'.__线路__.
“\n\n---错误---\n”.打印(r)($错误编号,真的).
“\n\n---ERRSTR---\n”.打印(r)($errstr(错误字符串),真的).
“\n\n---ERRFILE---\n”.打印(r)($errfile(错误文件),真的).
“\n\n---ERRLINE---\n”.打印(r)($errline(错误代码),真的).
“\n\n----ERRCONTEXT---\n”.打印(r)($errcontext(错误上下文),真的).
“\n\nerrorHandler()的回溯”.
打印(r)(调试回溯(),真的);
}

功能
( )
{
//echo“a()的回溯\n”.print_r(debug_backtrace(),true);
asdfasdf标准;//oops(操作系统)
}

功能
b条()
{
//echo“b()的回溯\n”.print_r(debug_backtrace(),true);
();
}

b条();
?>

输出:

<原始>

在第9行输入errorhandler()

---ERRNO公司---
8

---ERRSTR公司---
使用未定义的常量asdfasdf-假定为“asdfasdf”

---错误文件---
/主页/theotek/test-1.php

---ERRLINE公司---
23

---ERRCONTEXT(错误上下文)---
阵列
(
)

errorHandler()的回溯
阵列
(
[0]=>数组
(
[功能]=>错误处理程序
[args]=>阵列
(
[0] => 8
[1] =>使用未定义的常数asdfasdf-假定为“asdfasdf”
[2] =>/home/theotek/test-1.php
[3] => 23
[4] =>数组
(
)

)

)

[1] =>数组
(
[文件]=>/home/theotek/test-1.php
[行]=>23
[功能]=>a
)

[2] =>数组
(
[文件]=>/home/theotek/test-1.php
[行]=>30
[功能]=>a
[args]=>阵列
(
)

)

[3] =>数组
(
[文件]=>/home/theotek/test-1.php
[行]=>33
[功能]=>b
[args]=>阵列
(
)

)

)

</原始>

因此,回溯数组的第一个成员并不奇怪,除了缺少的“文件”和“行”成员。

回溯的第二个成员似乎是用于触发错误的zend引擎中的钩子。

其他成员是正常的回溯。
匿名
19年前
在php.ini中配置错误日志文件时,可以使用绝对路径或相对路径。将根据生成脚本的位置解析相对路径,您将在每个包含脚本的目录中获得一个日志文件。如果希望所有错误消息都指向同一文件,请使用该文件的绝对路径。

在某些应用程序开发方法中,存在应用程序根目录的概念,用“/”表示(即使在Windows上)。然而,PHP似乎没有这个概念,在日志文件路径中使用“/”作为初始字符会在Windows上产生奇怪的行为。

如果您在Windows上运行并设置了,请在php.ini中:

error_log=“/php_error.log”

您将收到一些但不是全部的错误消息。文件将出现在

c: \php_error.log

并包含内部生成的错误消息,使错误日志似乎正在工作。但是,error_log()请求的日志消息不会出现在此处或其他任何地方,这使得包含这些消息的代码似乎没有得到处理。

显然,在Windows上,内部生成的错误会将“/”解释为“C:\”(或者,如果你在其他地方安装了Windows,可能是另一个驱动器——我还没有测试过)。然而,error_log进程显然找不到“/”(这是可以理解的),消息被悄悄删除。
卡拉迪网络公司jbq
16年前
使用syslog配置时有关error_log的精度:syslig()调用的严重性为NOTICE。
petrov dot michael()gmail公司
17年前
我发现,在强制关闭display_errors的服务器上,调试语法错误非常不方便,因为它们会导致致命的启动错误。我已使用以下方法绕过此限制:

语法错误位于文件“syntax.php”中,因此我使用以下代码创建了一个文件“syndax.debug.php“:

<?php(电话)
错误_报告
(全部(_ALL));
ini_集('显示错误',“打开”);

包括(
'语法.php');
?>

5行文件保证没有错误,允许PHP在包含之前导致致命启动错误的文件之前执行其中的指令。现在,这些致命的启动错误变成了运行时致命错误。
到顶部