PHP의 오류 처리에 대한 자세한 설명
오류 보고
PHP 프로그램의 오류는 일반적으로 다음 세 가지 영역에 속합니다.
1. 구문 오류
구문 오류는 가장 일반적이고 쉽습니다. 고치다. 예: 코드에 세미콜론이 없습니다. 이러한 유형의 오류는 스크립트 실행을 방해합니다
2. 런타임 오류
이 유형의 오류는 일반적으로 PHP 스크립트의 실행을 방해하지 않지만 현재 수행 중인 작업을 방해합니다. 오류가 출력되는데 php 스크립트는 계속 실행됩니다
3. 논리 오류
이런 종류의 오류는 스크립트 실행을 방해하지도 않고 오류 메시지를 출력하지도 않습니다
[참고] php.ini 구성 파일의 Display_errors가 기본값인 on에서 off로 설정되어 있으면 오류가 표시되지 않습니다.[注意]若将php.ini配置文件中的display_errors从默认的on设置为off,将不显示任何错误
在PHP脚本中可调用ini_set()函数,动态设置php.ini配置文件
ini_set("display_errors","On"); //显示所有错误信息
错误级别
实际上,表格中的13个错误类型可以分为3类:注意级别、警告级别和错误级别。一般地,在开发过程中,忽略注意级别的错误
<?php getType($a);//未定义变量,注意级别 echo "1111111111111111<br>"; getType();//未传入参数,警告级别 echo "222222222222222222222<br>"; getType3();//函数名错误,错误级别 echo "333333333333333333333<br>"; ?>
错误处理
1、第一种错误处理方法是修改配置文件
错误级别默认为提示所有级别的错误:error_reporting = E_ALL
把error_reporting = E_ALL
改为error_reporting = E_ALL & ~E_NOTICE
表示不提示注意级别的错误。然后,重启服务生效
error_reporting = E_ALL & ~E_NOTICE
抛出任何非注意的错误,默认值error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR
只考虑致命的运行时错误、新解析错误和核心错误error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
报告除用户导致的错误之外的所有错误
2、第二种错误处理方法是使用错误处理函数
在PHP脚本可以通过error_reporting( )函数动态设置错误报告级别
<?php error_reporting(E_ALL & ~E_NOTICE); getType($a);//注意级别 echo "1111111111111111<br>"; getType();//警告级别 echo "222222222222222222222<br>"; getType3();//错误级别 echo "333333333333333333333<br>";?>
自定义错误处理
自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置,以下几种情况可以考虑自定义错误处理:1、记下错误的信息,及时发现一些生产环境出现的问题;2、屏蔽错误;3、控制错误的输出; 4、作为调试工具
使用set_error_handler()函数来设置用户自定义错误处理
<?php //error_reporting(E_ALL & ~E_NOTICE); //在php中注册一个函数来处理错误报告,替代默认的方式 set_error_handler("myerrorfun"); $mess = ""; //自定义错误报告处理函数 function myerrorfun($error_type, $error_message, $error_file, $error_line) { global $mess; $mess.="发生错误级别为{$error_type}类型, 错误消息<b>{$error_message}</b>, 在文件<font >{$error_file}</font>中, 第{$error_line}行。<br>"; } getType($a); echo "1111111111111111<br>"; getType(); echo "222222222222222222222<br>"; echo "--------------------------------------------<br>"; echo $mess; ?>
错误日志
一般地,程序都会保存错误日志,用来记录程序运行时的错误信息。且错误日志都有其默认的存储位置。对于错误信息和错误日志的位置,我们都可以进行修改
在PHP.ini配置文件中,有以下几项可以对错误日志进行设置
error_reporting = E_ALL
//将向PHP发送每个错误display_errors=Off
//不显示错误报告log_errors=On //决定日志语句记录的位置
log_errors_max_log=1024
//每个日志项的最大长度error_log=G:/myerror.log
PHP 스크립트에서 ini_set() 함수를 호출하여 동적으로 설정할 수 있습니다. php.ini 구성 파일
< code> ini_set("display_errors","On"); //모든 오류 메시지 표시
오류 수준🎜🎜🎜🎜🎜 사실 13가지 오류 유형은 표는 주의 수준, 경고 수준, 오류 수준의 3가지 범주로 나눌 수 있습니다. 일반적으로 개발 중에는 주의 수준 오류를 무시하세요🎜
<?phperror_log("登录失败了!");?>
error_reporting = E_ALL< /code>🎜🎜 <code>error_reporting = E_ALL
를 error_reporting = E_ALL & ~E_NOTICE
로 변경하여 주의 수준 오류가 표시되지 않음을 나타냅니다. 그런 다음 서비스를 다시 시작하면 적용됩니다.🎜🎜error_reporting = E_ALL & ~E_NOTICE
눈에 띄지 않는 오류가 발생하면 기본값error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR
은 치명적인 런타임만 고려합니다. , 새로운 구문 분석 오류 및 핵심 오류 error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
사용자로 인한 오류를 제외한 모든 오류 보고🎜🎜🎜🎜🎜🎜2. 두 번째 오류 처리 방법은 오류 처리 기능을 사용하는 것입니다🎜🎜 🎜 PHP 스크립트에서는 error_reporting() 함수를 통해 오류 보고 수준을 동적으로 설정할 수 있습니다. 🎜<?php try { $error = 'Always throw this error'; throw new Exception($error); //创建一个异常对象,通过throw语句抛出 echo 'Never executed'; //从这里开始,try代码块内的代码将不会再被执行 } catch (Exception $e) { echo ‘Caught exception: ’.$e->getMessage()." "; //输出捕获的异常消息 } echo 'Hello World'; //程序没有崩溃继续向下执行?>
<?phpclass Exception{ protected $message = 'Unknown exception'; // 异常信息 private $string; // __toString cache protected $code = 0; // 用户自定义异常代码 protected $file; // 发生异常的文件名 protected $line; // 发生异常的代码行号 private $trace; // backtrace private $previous; // previous exception if nested exception public function __construct($message = null, $code = 0, Exception $previous = null); final private function __clone(); // Inhibits cloning of exceptions. final public function getMessage(); // 返回异常信息 final public function getCode(); // 返回异常代码 final public function getFile(); // 返回发生异常的文件名 final public function getLine(); // 返回发生异常的代码行号 final public function getTrace(); // backtrace() 数组 final public function getPrevious(); // 之前的 exception final public function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息 // Overrideable public function __toString(); // 可输出的字符串}?>
error_reporting = E_ALL
//됩니다. PHP로 전달되어 각 오류를 보냅니다. display_errors=Off
//오류 표시 안함 보고서log_errors=On //로그 문 기록 위치 확인
log_errors_max_log=1024< /code> / /각 로그 항목의 최대 길이<code>error_log=G:/myerror.log
//오류가 기록되는 파일을 지정합니다🎜🎜🎜 php 파일에서 다음 함수를 사용할 수 있습니다. 오류 메시지를 사용자 정의하기 위한 error_log() 🎜<?php /* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */ class MyException extends Exception{ //重定义构造器使第一个参数 message 变为必须被指定的属性 public function __construct($message, $code=0){ //可以在这里定义一些自己的代码 //建议同时调用 parent::construct()来检查所有的变量是否已被赋值 parent::__construct($message, $code); } public function __toString() { //重写父类方法,自定义字符串输出的样式 return __CLASS__.":[".$this->code."]:".$this->message."<br>"; } public function customFunction() { //为这个异常自定义一个处理方法 echo "按自定义的方法处理出现的这个类型的异常<br>"; } }?>
try{
使用try去包含可能会发生异常的代码
一旦出现异常try进行捕获异常,交给catch处理。
抛出异常语句:throw 异常对象。
}catch(异常对象参数){
在这里做异常处理。
}[catch(。,,){
.. .. ..
}]
<?php try { $error = 'Always throw this error'; throw new Exception($error); //创建一个异常对象,通过throw语句抛出 echo 'Never executed'; //从这里开始,try代码块内的代码将不会再被执行 } catch (Exception $e) { echo ‘Caught exception: ’.$e->getMessage()." "; //输出捕获的异常消息 } echo 'Hello World'; //程序没有崩溃继续向下执行?>
自定义异常
用户可以用自定义的异常处理类来扩展PHP内置的异常处理类。以下的代码说明了在内置的异常处理类中,哪些属性和方法在子类中是可访问和可继承的
<?phpclass Exception{ protected $message = 'Unknown exception'; // 异常信息 private $string; // __toString cache protected $code = 0; // 用户自定义异常代码 protected $file; // 发生异常的文件名 protected $line; // 发生异常的代码行号 private $trace; // backtrace private $previous; // previous exception if nested exception public function __construct($message = null, $code = 0, Exception $previous = null); final private function __clone(); // Inhibits cloning of exceptions. final public function getMessage(); // 返回异常信息 final public function getCode(); // 返回异常代码 final public function getFile(); // 返回发生异常的文件名 final public function getLine(); // 返回发生异常的代码行号 final public function getTrace(); // backtrace() 数组 final public function getPrevious(); // 之前的 exception final public function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息 // Overrideable public function __toString(); // 可输出的字符串}?>
[注意]如果使用自定义的类来扩展内置异常处理类,并且要重新定义构造函数的话,建议同时调用parent::__construct()来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载__toString() 并自定义输出的样式
<?php /* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */ class MyException extends Exception{ //重定义构造器使第一个参数 message 变为必须被指定的属性 public function __construct($message, $code=0){ //可以在这里定义一些自己的代码 //建议同时调用 parent::construct()来检查所有的变量是否已被赋值 parent::__construct($message, $code); } public function __toString() { //重写父类方法,自定义字符串输出的样式 return __CLASS__.":[".$this->code."]:".$this->message."<br>"; } public function customFunction() { //为这个异常自定义一个处理方法 echo "按自定义的方法处理出现的这个类型的异常<br>"; } }?>
<?php try { //使用自定义的异常类捕获一个异常,并处理异常 $error = '允许抛出这个错误'; throw new MyException($error); //创建一个自定义的异常类对象,通过throw语句抛出 echo 'Never executed'; //从这里开始,try代码块内的代码将不会再被执行 } catch (MyException $e) { //捕获自定义的异常对象 echo '捕获异常: '.$e; //输出捕获的异常消息 $e->customFunction(); //通过自定义的异常对象中的方法处理异常 } echo '你好呀'; //程序没有崩溃继续向下执行?>
相关参考:php教程
위 내용은 PHP의 오류 처리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!