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

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

时间:2023-03-29 23:45:48 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'捕获异常:',$e->getMessage(),"\n";throw$e;}异常的最佳实践●异常可以让代码更清晰,让开发者专注于编写业务逻辑。●构建可扩展的例外是非常技术性的。SPL异常还不够吗?●CaptureExceptions应该只捕获本层能处理的异常,不能处理的异常让上游代码处理。PHP7中的异常PHP7鼓励使用异常而不是错误,但是不可能一下子推翻错误处理机制。需要兼容性,只能慢慢过渡。但是可以灵活使用。PHP中定义了Error异常。注意这个异常和Exception是并列的。开启严格模式后,PHP7中的很多错误都被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。我们可以通过set_error_handler()函数将所有错误转换为ErrorException。这样异常就可以愉快的统一使用了。以上就是对PHP错误异常细节的系统认识,希望对大家有所帮助。码字不易,点个赞,支持支持相关推荐:与前端开发息息相关的HTTP协议知识结合B站源码泄露热点,聊聊B站有趣的源码片段跨平台技术Flutter未来的内部接口和java中的内部接口外部接口的区别点击验证码,更改验证码的值PHP工程师面试应该注意哪些方面?阅读原文