当前位置: 首页 > 后端技术 > PHP

系统理解PHP中的错误和异常

时间:2023-03-30 05:21:57 PHP

PHP语言简单的原因之一是PHP的错误处理机制。随着PHP语言越来越现代,异常也出现了。这篇博文简单说说错误和异常,以供对系统的理解。另外,对于任何语言来说,一般来说,异常的存在是很普遍的,所以学习一门语言,理解异常机制是必不可少的。什么是错误?会报一些错误,错误分为多种类型。除了E_ERROR和E_CORE_ERROR错误,其他错误不会终止程序。PHP之所以让人觉得简单,是因为程序不会经常报错,给人一种书写流畅和方便的错觉。也正是这个原因,PHP程序的严谨性和准确性就差了很多。例如当mysql_fetch_array查询遇到网络错误返回FALSE(程序还没有终止)时,如果调用程序认为查询没有匹配的数据,那么程序本身就是错误的。我们可以使用php.ini中的error_reporting命令或动态调用error_reporting()函数来选择要报告的错误类型。display_errors命令可以控制在线是否输出错误。error_log命令可以控制错误输出到日志。如何正确使用错误无论是系统函数还是自定义函数,如果内部遇到错误,如何通知调用者?通常它由函数返回TRUE或FALSE来指示。这种处理方式有几个缺点:●调用者只知道发生了错误,但返回的错误信息太少,没有错误类型的描述●程序处理逻辑和错误处理混在一起,生成的代码会很不清楚。一个小技巧:error_get_last()函数会返回最近错误的具体原因。最佳实践:●set_error_handler()函数管理所有错误●trigger_error()函数可以触发自定义错误,可以在函数中使用而不是返回语句●所有错误输出到日志,同时定义错误类型显示给用户的错误,比如以更友好的方式向用户返回错误●生产环境应该关闭display_errors命令,开发环境应该通过该命令开启PHP老框架Codeigniter处理错误的方式可以从`function_error_handler($severity,$message,$filepath,$line){$is_error学习=(((E_ERROR|E_COMPILE_ERROR|E_CORE_ERROR|E_USER_ERROR)&$severity)===$severity);//输出500错误HTTP状态码if($is_error){set_status_header(500);}//对于不需要处理的错误会直接中断if(($severity&error_reporting())!==$severity){return;}//在日志中记录所有错误$_error=&load_class('Exceptions','core');$_error->log_exception($severity,$message,$filepath,$line);//所有错误的友好输出if(str_ireplace(array('off','none','no','false','null'),'',ini_get('display_errors'))){$_error->show_php_error($severity,$message,$filepath,$line);}//如果出现致命错误则退出if($is_error){exit(1);}}set_error_handler('_error_handler');`异常也是错误,它有以下特点:●异常可以自定义,SPL提供了多种异常类型,你也可以扩展它●异常是最常见的动作就是捕获,让开发者可以根据具体错误进行后续处理。例如,他们可以根据异常的上下文向用户返回一个友好的提示。或者继续抛异常,让上游程序处理。如果仍然没有捕获到异常,则程序将直接终止。●异常的另一个动作是抛出。如果通过函数来??写业务逻辑,遇到突发情况可以直接抛出异常。●异常可以被代码层层捕获。如果外部程序没有捕获到,代码会直接终止●如果PHP中的异常捕获不到,那么作为致命错误写入系统错误日志。让我们用一个直观的代码来说明它:`functioninverse($x){if($x<10){thrownewException('x<10');}elseif($x>=10and$x<100){thrownewLogicException('x>=10andx<100');}return$x;}try{echoinverse(2)."\n";}catch(LogicException$e){echo'CaughtLogicException:',$e->getMessage(),"\n";}catch(Exception$e){echo'CaughtException:',$e->getMessage(),"\n";throw$e;}`异常的最佳实践●异常可以让代码更清晰,让开发者专注于编写商业逻辑。●构建可扩展的异常是非常有技术性的,难道SPL异常还不够吗??●捕获异常应该只捕获本层能处理的异常,不能处理的异常让上游代码处理。PHP7中的异常PHP7鼓励使用异常而不是错误,但是错误处理机制不可能一下子推翻,需要兼容,所以只能慢慢过渡。但是可以灵活统一地使用异常。错误异常错误异常是在PHP中定义的。注意这个异常和Exception是并列的。它由Error异常抛出。这样异常就可以统一使用`declare(strict_types=1);functionadd(int$a,int$b){return$a+$b;}try{echoadd("3","4");}catch(TypeError$e){//TypeError继承自Errorecho$e->getMessage();}`ErrorExceptionErrorException继承自Exception。我们可以通过集合_error_handler()函数将所有错误转换为ErrorException。这样异常就可以愉快的统一使用了。以上就是对PHP错误异常细节的系统认识,希望对大家有所帮助。阅读原文:系统理解PHP中的错误和异常