深入解析PHP中的异常与错误:区别、处理机制及应用场景详解

PHP错误是属于PHP程序本身的问题。它们一般是由非法语法和环境问题引起的,使编译器无法通过检查甚至无法运行。 PHP异常通常是业务逻辑中与正常流程不同的意外情况。它们不是语法错误。本文介绍了PHP中异常和错误的相关信息。有需要的朋友可以参考一下。

深入解析PHP中的异常与错误:区别、处理机制及应用场景详解

1. 异常和错误

异常是指程序运行过程中出现的不符合预期、与正常流程不同的情况。该错误是其本身的问题,是由于非法语法或环境问题导致编译器无法通过检查设置并运行而导致的。

由于PHP一开始没有异常处理,为了进入企业级开发,模仿Java等语言引入了异常。导致 PHP 中遇到的任何自错误都会触发错误而不是抛出异常(在某些情况下,错误和异常都会被抛出)。一旦PHP遇到异常代码,大多数情况下,它会直接抛出错误而不是异常。

PHP只能在抛出异常后使用try...catch来捕获异常(一般都是这样,有的异常可以自动捕获)。

PHP中异常通常用于以下场景:

1、对程序的悲观预测:如果你认为你的代码无法一一处理各种可预见和不可预见的情况。

2、程序需求和业务关注点:如果数据的一致性非常高,可以使用try...catch来最大程度地减少异常带来的逻辑中断和破坏,并且补救处理后不会影响业务逻辑。诚信。

3、语言层面的鲁棒性要求:通过精确控制运行时流程,当程序中断时,使用try...catch可预见地缩小可能发生错误的范围,及时捕获异常,并做出相应的补救措施。

2.如何处理php异常

由于历史原因,PHP的异常处理能力还不够。大多数情况下,异常不能自动抛出。必须先用if...else判断,然后才能手动抛出异常。

手动抛出异常没有多大意义,因为这意味着代码中已经充分预料到了错误。同时,这种方法会让你在复杂的逻辑判断和处理中感到困惑。导致失去了异常的真正优点。

那么有没有更好的方法来抛出异常呢?是的,合并是错误的

3.php错误

错误是导致脚本运行不正确的情况。

php中的主要错误级别如下:

1. deprecated:最低级别的错误,意思是“不推荐,不推荐”。例如,如果在PHP 5中使用ereg系列正则函数,就会出现。此类错误通常是由于使用不推荐使用或过时的函数或语法引起的。不影响程序正常运行,但建议纠正。

2.注意:一般指语法中不恰当的地方。如果使用了变量但未定义,则会报告此错误。不影响程序的正常流程。

3.警告:更高级别的错误。当语法中出现非常不合适的情况时,例如函数参数不匹配,就会出现此错误。结果无法得到预期的结果,需要修改代码。

4. Fetal error:致命错误,直接导致程序终止。此类错误必须予以纠正。

5. Prase error:语法解析错误。以上都是运行时错误。运行前会抛出此错误。

在PHP中,一共有16个错误级别,但主要的就是以上几种。

错误.php

$data = '2012-12-20';
if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $data, $regs)) { 
 echo "$reg[3].$regs[2].$regs[1]";
} else {
 echo "Invalid data format: $data";
}
$a = array('o' => 2, 4, 6, 8);
echo $a[o]; 
$result = array_sum($a, 3);
echo func();
echo '致命错误后,还会执行吗?'; 
//echo '最高级别错误', $55;

登录后复制

上述代码执行后,会出现四个错误级别。如果无法完全看到它们,则需要将ini配置文件中的错误显示级别修改为E_ALL。

4. 自定义错误处理程序

您可以使用 set_error_handler() 函数来托管错误处理程序并自定义错误处理过程。

如果您想取消托管,可以在同一页面中使用restore_error_handler()来取消托管。

如果你想自己抛出错误,可以使用trigger_error()函数。

错误代码:[{$errno}] {$errstr}", PHP_EOL;
 echo "错误所在代码行:{$errline} 文件{$errfile}", PHP_EOL;
 echo "PHP版本", PHP_VERSION, "(", PHP_OS, ")", PHP_EOL;
}
set_error_handler("customError", E_ALL | E_STRICT);
$a = array('o' => 2, 4, 6, 8);
echo $a[o];

登录后复制

执行上面的代码,可以看到错误信息是由我们自定义的handler输出的,完全绕过了系统handler。

如果错误发生在自定义处理程序之前,我们的自定义错误处理程序将不会被调用,因此应首先定义错误处理程序。

当然,并不是所有的错误级别都可以用set_error_handler来管理,例如EERROR、EPARSE、ECODEWARNING、ECOMPILEERROR、ECOMPILEWARNING和E_STRICT。这些错误消息可能以原始或不切实际的方式显示。

PHP 将许多异常视为错误,因此这些“异常”也可以使用 set_error_handler 来接管:

function customError($errno, $errstr, $errfile, $errline) 
{
 //自定义错误处理是,手动抛出异常
 throw new Exception($errstr);
}
set_error_handler('customError', E_ALL | E_STRICT);
try { 
 $a = 5/0;
} catch (Exception $e) {
 echo '错误信息:', $e->getMessage();
}

登录后复制

当然,这种方式也有其自身的优点和缺点:

缺点:

程序员必须依靠自己来控制异常的处理。对于异常高发区域和敏感区域,如果程序员处理不好,就会导致业务数据不一致。

优点:可以获取程序运行时的上下文信息,进行针对性修复。

诸如胎儿错误之类的错误无​​法被捕获,也无法在发生后恢复流程处理。但是,您可以使用 register_shutdown_function() 函数在程序终止或死亡时触发函数,从而为程序提供短暂的闪回。

在php4中,不支持析构函数,通常用来模拟析构函数。

class Shutdown 
{
 public function stop()
 {
 if (error_get_laster()) {
 print_r(error_get_laster());
 }
 die('Stop.');
 }
}
register_shutdown_function(array(new Shutdown(), 'stop'));
$a = new a(); //致命错误,导致失败
echo '必须终止';

登录后复制

对于Parse error级别的错误,除了修改ini文件,将错误信息写入日志之外,什么也做不了。

概括

PHP 中的错误和异常是两个不同的概念。这种设计从根本上导致了PHP的异常和错误与其他语言不同。在 Java 中,异常是报告错误的唯一方式。归根结底,两者的差异是由于对异常的理解不同造成的。大多数 PHP 异常只能通过某种方式手动抛出来捕获。它是一种半自动的异常处理机制。

无论是错误还是异常,都可以使用handler来接管系统现有的处理机制。

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

46阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

38阅读

php一句话木马,一句话木马ctf

2026年10月05日

41阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

43阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

41阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

38阅读