错误是开发人员在编程时面对的最常见事件。错误可以归类为句法,运行时或逻辑:语句结尾处缺少半隆是语法错误的示例;在服务器下降时尝试连接到数据库是运行时错误的一个示例;向变量提供错误的数据是逻辑错误的一个示例。为了帮助减少代码中的错误次数并减轻其效果,在您的Web应用程序中必须进行适当的错误处理。
本文是PHP错误处理中的速成课程。您将了解PHP内置错误报告级别,以及如何使用自定义错误处理程序和异常处理来处理错误。
钥匙要点
PHP错误处理对于维持Web应用程序的完整性和功能至关重要。它有助于识别和修复脚本执行期间可能出现的问题,从而通过控制发生错误时看到的内容来改善用户体验。
PHP提供了多个用于错误处理的内置功能,包括日志记录和显示它们。它还提供了通过注册错误处理程序和使用异常来自定义错误处理策略的灵活性。
可以使用set_error_handler()和set_exception_handler()函数来实现PHP中的自定义错误处理。这些允许开发人员定义自定义错误处理规则和异常,这对于记录错误或发送错误通知可能很有用。
PHP中的- 例外是脚本执行过程中发生的事件,破坏了指令的正常流程。可以使用尝试,捕捉并最终阻止它们来处理它们。如果在抛出异常时找不到捕获块,则PHP将显示致命错误并停止执行脚本。
-
php错误报告级别-
所有错误和警告都应记录。根据错误的严重性,应将通知发送给其他系统/团队。为了更好地评估其严重性,PHP提供了几个内置错误级别来描述错误的性质。每个级别都由整数值表示,并命名为常数,可以由程序员使用。下表取自官方的PHP文档,并显示了一些不同的级别。
-
可以将级别与位操作员一起掩盖,以包括或从PHP的配置中减去它们。例如,e_all | e_strict通过添加e_strict启用所有错误和警告(在5.4之前的PHP版本中必需)。
PHP提供了一些与记录和显示错误有关的配置指令。它们的价值通常取决于系统在开发还是生产环境中。该表显示了一些与错误相关的指令。
可以在php.ini,Web服务器配置文件(httpd.conf或.htaccess文件)中设置配置指令,也可以使用ini_set()函数在脚本中在运行时设置。阅读文档以获取有关指令以及如何/在何处设置它们的更多信息。
创建自定义错误处理程序
不向最终用户显示原始错误也是一个好习惯。显示的错误应用友好的自定义错误消息抽象。 PHP不仅提供了用于记录和显示错误的内置功能,而且还提供了提高错误的功能。您可以使用trigger_error()务实触发特定级别的错误。例如,此代码会触发e_user_notice警告,如果$ test的值大于1:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
登录后复制
登录后复制
登录后复制
当您设有错误处理基础架构时,使用TRIGGE_ERROR()触发错误非常有用,从而使您可以统一处理自定义错误以及PHP提出的错误和警告。
如果要实现自定义错误处理策略,例如根据其严重性向数据库发送电子邮件或记录错误,则需要使用SET_ERROR_HANDLER()来定义自定义错误处理程序。该函数接受两个参数:回调函数或静态方法,该方法将在增加错误时被调用,并且(可选)错误级别函数/方法处理。回调的签名是:
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
登录后复制
登录后复制
登录后复制
让我们看一下自定义错误处理程序功能。下面的示例在遇到一个数据库表数据库中记录错误:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
登录后复制
登录后复制
登录后复制
上面的摘要注册了一个错误处理程序,该处理程序执行以下操作:当出现非致命错误时,记录将插入数据库中,而不是显示错误并将其记录到文件中;当发生致命错误时,它将在数据库中记录并终止您的脚本。
但是,您应该注意的自定义错误处理程序有一些局限性。错误处理程序绕过PHP的标准错误处理行为,因此无法处理处理程序本身可能出现的错误。例如,如果数据库服务器关闭,则上述功能将无法记录日志。此外,错误处理程序无法捕获某些内部错误,例如e_core_error和e_compile_error,或同一文件中的e_strict错误,因为这些错误在处理程序有机会注册之前发生。
使用异常来处理错误
无论您使用的错误处理框架如何,在运行时总会出现问题。当然,您不希望这些错误显示在用户的浏览器中。这是例外处理进入图片的地方。异常使您可以优雅地处理错误和特殊情况。
php中的例外情况(或其任何子类)表示。可以使用掷球来抬起它们,并可以使用尝试/捕获块捕获。您可以扩展异常以创建自定义类型以捕获特定错误。
可能触发异常的代码将放置在TRY块中,并且要处理异常的代码将其放置在捕获块中。考虑以下片段:
如果虚拟getDatafromService()方法抛出了例外,则将捕获在捕获块中,并将显示一条消息。如果GetDataFromService()成功执行,那么该流将通过捕获块并继续整个脚本的其余部分。任何被抛出且未捕获的例外都会产生e_fatal错误,并在“无人例外”中产生E_FATAL错误。
异常类提供了六种不同的方法来访问有关引起问题的信息的信息,如下表所示。
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
登录后复制
登录后复制
登录后复制

创建自定义异常处理程序
PHP会让您像一个例外一样将任何对象扔掉,但是根据经验,例外应扩展PHP的内置异常类。根据对象的类型,您可以以不同的方式处理异常。自定常处理可以执行合适的操作,例如文件中的记录错误消息,提供有关通过检查调用堆栈等发生的行的确切详细信息。请查看此示例:
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
登录后复制
登录后复制
登录后复制
上面的代码定义了两种新的自定义类型,nameException
和EmailException,可用于指示不同的错误。然后在Try块中,代码检查是否已为变量$ name和$ email提供了值。如果两个是空的,则使用掷抛出适当的例外。执行相应的捕获块,以处理错误。
重新投入异常
尝试/捕获块可以嵌套。有时,您需要捕获异常,查看其某些属性,然后再次将其扔掉以让父母捕获块处理它。这通常对于检查错误条件并确定是否应致命是有用的。此示例代码演示了重新投入一个例外:
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
登录后复制
登录后复制
登录后复制
>未接收的异常处理程序
类似于SET_ERROR_HANDLER()允许您指定函数来处理运行时错误的方式类似,SET_EXECTION_HANDLER()函数允许您处理使其一直沿呼叫堆栈的异常处理而不会被任何捕获块捕获。例如,如果异常使它一直沿您的堆栈上升,那么最好将其记录在日志文件中。您可以创建一个回调函数,并在set_exception_handler()中注册,如下示例所示。
<span><span><?php
</span></span><span><span>function errorHandler($errno, $errstr, $errfile, $errline) {
</span></span><span> <span>static $db;
</span></span><span> <span>if (empty($db)) {
</span></span><span> <span>$db = new PDO(DSN, DBUSER, DBPASS);
</span></span><span> <span>}
</span></span><span>
</span><span> <span>$query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())";
</span></span><span> <span>$stmt = $db->prepare($query);
</span></span><span>
</span><span> <span>switch ($errno) {
</span></span><span> <span>case E_NOTICE:
</span></span><span> <span>case E_USER_NOTICE:
</span></span><span> <span>case E_DEPRECATED:
</span></span><span> <span>case E_USER_DEPRECATED:
</span></span><span> <span>case E_STRICT:
</span></span><span> <span>$stmt->execute(array("NOTICE", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_WARNING:
</span></span><span> <span>case E_USER_WARNING:
</span></span><span> <span>$stmt->execute(array("WARNING", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_ERROR:
</span></span><span> <span>case E_USER_ERROR:
</span></span><span> <span>$stmt->execute(array("FATAL", $errstr, $errfile, $errline));
</span></span><span> <span>exit("FATAL error <span><span>$errstr</span> at <span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span>
</span><span> <span>default:
</span></span><span> <span>exit("Unknown error at <span><span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span> <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>set_error_handler("errorHandler");
</span></span><span>
</span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error("Value of <span><span>$test</span> must be 1 or less"</span>, E_USER_NOTICE);
</span></span><span><span>}</span></span>
登录后复制
摘要
PHP提供多种内置功能,用于处理错误条件,包括日志记录和显示它们。它还为您提供了通过注册错误处理程序和使用异常来自定义错误处理策略的灵活性。错误是生活的事实,但希望我在本文中提供的信息将帮助您更优雅地处理它们。
>图像通过Ilya Andriyanov / shutterstock
>常见问题(常见问题解答)有关php
中错误处理的问题
>在PHP中处理错误的重要性是什么?
> PHP中的错误处理对于维持Web应用程序的完整性和功能至关重要。它可以帮助开发人员识别并解决在执行脚本期间可能出现的问题。如果没有适当的错误处理,次要问题可能会导致重大问题,例如崩溃应用程序或向用户展示敏感信息。它还改善了用户体验,因为它允许开发人员控制发生错误时看到的内容,而不是显示令人困惑的错误消息。
> PHP默认如何处理错误?
默认情况下,PHP将错误报告发送到服务器的错误日志并在屏幕上显示错误消息。对于实时网站而言,此行为不是理想的选择,因为它可以向用户揭示敏感信息。因此,建议更改现场网站的默认错误处理设置。
> php?
php中有哪些类型的错误将错误分类为多种类型,包括致命错误,警告,解析,解析错误和注意事项。致命错误是关键错误,例如调用不存在的功能或写入不写的文件。警告是允许脚本继续运行的非致命错误。当脚本中存在语法错误时,就会发生解析错误。在执行脚本时,php会遇到的通知是次要错误或可能的错误。
如何自定义PHP中的错误处理?这些功能允许您定义自定义错误处理规则和异常。您可以指定一个自定义函数来处理错误,该功能对于记录错误或发送错误通知很有用。
>
> php?
>的例外是一个例外情况,是在执行脚本中破坏脚本指令正常流程的脚本时发生的事件。当抛出异常时,PHP将停止执行脚本并开始寻找一个捕获块来处理异常。如果找不到捕获块,PHP将显示致命的错误并停止执行脚本。
如何处理PHP?
PHP中的异常提供尝试,捕捉,最后阻止以处理异常。尝试块包含可能引发异常的代码。捕获块包含用于处理异常的代码。最终块包含将执行的代码,无论是否引发异常。错误由PHP引擎处理,可以使用错误报告设置和自定义错误处理程序来控制。另一方面,例外是由脚本处理的,可以通过尝试,捕获,最后封锁。>
>如何关闭PHP中的错误报告?但是,关闭错误报告不建议用于实时网站,因为它可能会使很难识别和修复问题。>
> @运算符在PHP错误处理中的作用是什么?>
@ operator in php中的 @ operator用于抑制错误消息。当将PHP中的表达式添加到一个表达式中时,该表达式可能生成的任何错误消息都将被忽略。>
>如何在PHP中记录错误?
php提供error_log()函数以将错误消息发送到服务器的错误日志或指定文件。此功能可用于跟踪错误和调试。您还可以通过更改php.ini文件中的log_errors指令来配置php以记录所有错误。
以上是phpmaster | PHP中的错误处理的详细内容。更多信息请关注PHP中文网其他相关文章!