Table of Contents
Error reporting level (just understand it)
例子解释:" >例子解释:
Abnormal rules" >Abnormal rules
Home php教程 php手册 Error handling and exception handling mechanism in PHP

Error handling and exception handling mechanism in PHP

Jul 11, 2016 pm 08:00 PM
php code Open source Exception handling mechanism programming programming language software development Error handling

Error handling is an important part when writing PHP programs. If your program lacks error detection code, it looks unprofessional and opens the door to security risks

Example:
$a = fopen('test.txt','r');
//The file is opened here without judging it. If the file does not exist, an error will be reported
?>
Then the correct way to write it should be as follows:
if(file_exists('test.txt')){
$f=fopen('test.txt','r');
//Close after use
fclose($f);
}
?>
1. Three ways to handle PHP errors
A. Simple die() statement;
Equivalent to exit();
Example:
if(!file_exists('aa.txt')){
die('File does not exist');
} else {
//Perform operation
}
//If die() above is triggered, then the echo connection here will not be executed
echo 'ok';
Concise writing:
file_exits('aaa.txt') or die('File does not exist');
echo 'ok';
B. Custom errors and error triggers
1. Error handler (custom error, generally used for syntax error handling)
Create a custom error function (handler), which must be able to handle at least two parameters (error_level and errormessage), but can accept up to five parameters (error_file, error_line, error_context)
Grammar:
function error_function($error_level,$error_message,$error_file,$error_line,$error_context)
//After creation, you need to rewrite the set_error_handler(); function
set_error_handler('error_function',E_WARNING); //Here error_function corresponds to the custom handler name created above, and the second parameter is to use the custom error handler Error level;

Error reporting level (just understand it)

These error reporting levels are different types of errors that error handlers are designed to handle:

Value Constant Description
2 E_WARNING Nonfatal run-time error. Do not pause script execution.
8 E_NOTICE
常量 描述
2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE

Run-time 通知。

脚本发现可能有错误发生,但也可能在脚本正常运行时发生。

256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL

所有错误和警告,除级别 E_STRICT 以外。

(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

 

Run-time notification. Script discovery errors may occur, but may also occur while the script is running normally.
256 E_USER_ERROR Fatal user-generated error. This is similar to E_ERROR set by the programmer using the PHP function trigger_error().
512 E_USER_WARNING Non-fatal user-generated warning. This is similar to the E_WARNING set by the programmer using the PHP function trigger_error().
1024 E_USER_NOTICE User-generated notifications. This is similar to E_NOTICE set by the programmer using the PHP function trigger_error().
4096 E_RECOVERABLE_ERROR Catchable fatal error. Like E_ERROR, but can be caught by a user-defined handler. (see set_error_handler())
8191 E_ALL All errors and warnings except level E_STRICT. (In PHP 6.0, E_STRICT is part of E_ALL)
2. Error trigger (generally used to handle logical errors)
Requirement: For example, if you want to receive an age, if the number is greater than 120, it is considered an error
Traditional method:
if($age>120){
echo 'Wrong age';exit();
}
Use trigger:
if($age>120){
                                                                                                                                                    //trigger_error('error message'[,'error level']); The error level here is optional and is used to define the level of the error
                                      //User-defined levels include the following three types: E_USER_WARNING, E_USER_ERROR, E_USER_NOTICE
                                                                                                                                                                                                                             }
//Custom processor, same as above
function myerror($error_level,$error_message){
echo 'error text';
      }
// At the same time, the default processing function of the system needs to be changed
          set_error_handler('myerror',E_USER_WARNING);//Same as above, the first parameter is the name of the custom function, and the second is the error level [The error levels here are usually the following three :E_USER_WARNING, E_USER_ERROR, E_USER_NOTICE
// Now use Trigger_error to use the custom error processing function
Practice questions:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<span style="color: #008080;"> 1</span> <span style="color: #000000;">php

</span><span style="color: #008080;"> 2</span>     date_default_timezone_set('PRC'<span style="color: #000000;">);

</span><span style="color: #008080;"> 3</span>     <span style="color: #0000ff;">function</span> myerror(<span style="color: #800080;">$error_level</span>,<span style="color: #800080;">$error_message</span><span style="color: #000000;">){

</span><span style="color: #008080;"> 4</span>         <span style="color: #800080;">$info</span>= "错误号:<span style="color: #800080;">$error_level</span>\n"<span style="color: #000000;">;

</span><span style="color: #008080;"> 5</span>         <span style="color: #800080;">$info</span>.= "错误信息:<span style="color: #800080;">$error_message</span>\n"<span style="color: #000000;">;

</span><span style="color: #008080;"> 6</span>         <span style="color: #800080;">$info</span>.= '发生时间:'.<span style="color: #008080;">date</span>('Y-m-d H:i:s'<span style="color: #000000;">);

</span><span style="color: #008080;"> 7</span>         <span style="color: #800080;">$filename</span>='aa.txt'<span style="color: #000000;">;

</span><span style="color: #008080;"> 8</span>         <span style="color: #0000ff;">if</span>(!<span style="color: #800080;">$fp</span>=<span style="color: #008080;">fopen</span>(<span style="color: #800080;">$filename</span>,'a'<span style="color: #000000;">)){

</span><span style="color: #008080;"> 9</span>             '创建文件'.<span style="color: #800080;">$filename</span>.'失败'<span style="color: #000000;">;

</span><span style="color: #008080;">10</span> <span style="color: #000000;">        }

</span><span style="color: #008080;">11</span>         <span style="color: #0000ff;">if</span>(<span style="color: #008080;">is_writeable</span>(<span style="color: #800080;">$filename</span><span style="color: #000000;">)){

</span><span style="color: #008080;">12</span>             <span style="color: #0000ff;">if</span>(!<span style="color: #008080;">fwrite</span>(<span style="color: #800080;">$fp</span>,<span style="color: #800080;">$info</span><span style="color: #000000;">)){

</span><span style="color: #008080;">13</span>                 <span style="color: #0000ff;">echo</span> '写入文件失败'<span style="color: #000000;">;

</span><span style="color: #008080;">14</span>             } <span style="color: #0000ff;">else</span><span style="color: #000000;"> {

</span><span style="color: #008080;">15</span>                 <span style="color: #0000ff;">echo</span> '已成功记录错误信息'<span style="color: #000000;">;

</span><span style="color: #008080;">16</span> <span style="color: #000000;">            }

</span><span style="color: #008080;">17</span>                         <span style="color: #008080;">fclose</span>(<span style="color: #800080;">$fp</span><span style="color: #000000;">);

</span><span style="color: #008080;">18</span>         } <span style="color: #0000ff;">else</span><span style="color: #000000;"> {

</span><span style="color: #008080;">19</span>             <span style="color: #0000ff;">echo</span> '文件'.<span style="color: #800080;">$filename</span>.'不可写'<span style="color: #000000;">;

</span><span style="color: #008080;">20</span> <span style="color: #000000;">        }

</span><span style="color: #008080;">21</span>         <span style="color: #0000ff;">exit</span><span style="color: #000000;">();

</span><span style="color: #008080;">22</span> <span style="color: #000000;">    }

</span><span style="color: #008080;">23</span>     <span style="color: #008080;">set_error_handler</span>('myerror',<span style="color: #ff00ff;">E_WARNING</span><span style="color: #000000;">);

</span><span style="color: #008080;">24</span>     <span style="color: #800080;">$fp</span>=<span style="color: #008080;">fopen</span>('aaa.txt','r'<span style="color: #000000;">);

</span><span style="color: #008080;">25</span> ?>

Copy after login
C. Error log
By default, according to the error_log configuration in php.ini, php sends error records to the server's error recording system or file. Error records can be sent to a file or remote destination by using the error_log() function;
Grammar:
                                                                                                                                                                
The type part usually uses 3, which means appending error information to the end of the file without overwriting the original content
Destination represents the destination, that is, the stored file or remote destination
For example: error_log("$error_info",3,"errors.txt");
2. PHP exception handling [Key points]
1. Basic grammar
try{
//Code that may cause errors or exceptions
//catch Exception is a defined exception class in PHP
} catch(Exception $e){
//Exception handling, method:
                //1、自己处理
                //2、不处理,将其再次抛出
        }
2、处理处理程序应当包括:
  1. Try - 使用异常的函数应该位于 "try"  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
  3. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象 

让我们触发一个异常:

1

 

Copy after login
Copy after login
Copy after login

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<span style="color: #008080;"> 1</span> <span style="color: #000000;">php

</span><span style="color: #008080;"> 2</span> <span style="color: #008000;">//</span><span style="color: #008000;">创建可抛出一个异常的函数</span>

<span style="color: #008080;"> 3</span> <span style="color: #0000ff;">function</span> checkNum(<span style="color: #800080;">$number</span><span style="color: #000000;">){

</span><span style="color: #008080;"> 4</span>     <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$number</span>>1<span style="color: #000000;">){

</span><span style="color: #008080;"> 5</span>         <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>("Value must be 1 or below"<span style="color: #000000;">);

</span><span style="color: #008080;"> 6</span> <span style="color: #000000;">    }

</span><span style="color: #008080;"> 7</span>     <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;

</span><span style="color: #008080;"> 8</span> <span style="color: #000000;">}

</span><span style="color: #008080;"> 9</span>

<span style="color: #008080;">10</span> <span style="color: #008000;">//</span><span style="color: #008000;">在 "try" 代码块中触发异常</span>

<span style="color: #008080;">11</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">{

</span><span style="color: #008080;">12</span>     checkNum(2<span style="color: #000000;">);

</span><span style="color: #008080;">13</span>     <span style="color: #008000;">//</span><span style="color: #008000;">如果异常被抛出,那么下面一行代码将不会被输出</span>

<span style="color: #008080;">14</span>     <span style="color: #0000ff;">echo</span> 'If you see this, the number is 1 or below'<span style="color: #000000;">;

</span><span style="color: #008080;">15</span> }<span style="color: #0000ff;">catch</span>(<span style="color: #0000ff;">Exception</span> <span style="color: #800080;">$e</span><span style="color: #000000;">){

</span><span style="color: #008080;">16</span>     <span style="color: #008000;">//</span><span style="color: #008000;">捕获异常</span>

<span style="color: #008080;">17</span>     <span style="color: #0000ff;">echo</span> 'Message: ' .<span style="color: #800080;">$e</span>-><span style="color: #000000;">getMessage();

</span><span style="color: #008080;">18</span> <span style="color: #000000;">}

</span><span style="color: #008080;">19</span> ?>

Copy after login

1

 

Copy after login
Copy after login
Copy after login

1

 

Copy after login
Copy after login
Copy after login

上面代码将获得类似这样一个错误:

1

<span style="font-family: 'Microsoft Yahei';">Message: Value must be 1 or below </span>

Copy after login

例子解释:

上面的代码抛出了一个异常,并捕获了它:

  1. 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
  2. 在 "try" 代码块中调用 checkNum() 函数。
  3. checkNum() 函数中的异常被抛出
  4. "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
  5. 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息

不过,为了遵循“每个 throw 必须对应一个 catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。

set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数

//设置一个顶级异常处理器

function myexception($e){

   echo 'this is top exception';

} //修改默认的异常处理器

set_exception_handler("myexception");

try{

  $i=5;

  if($i

    throw new exception('$i must greater than 10');

  }

}catch(Exception $e){

  //处理异常

  echo $e->getMessage().'
';

  //不处理异常,继续抛出

  throw new exception('errorinfo'); //也可以用throw $e 保留原错误信息;

}

创建一个自定义的异常类

class customException extends Exception{

  public function errorMessage(){

    //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().': '.$this->getMessage().' is not a valid E-Mail address'; return $errorMsg;

  }

}

//Use

try{

Throw new customException('error message');

}catch(customException $e){

echo $e->errorMsg();

}

You can use multiple catches to return error messages under different circumstances

try{

 $i=5;

 if($i>0){

Throw new customException('error message');//Use a custom exception class to handle

 } if($i

Throw new exception('error2');//Use system default exception handling

 }

}catch(customException $e){

echo $e->getMessage();

}catch(Exception $e1){

echo $e1->getMessage();

}

Abnormal rules

  • Code that requires exception handling should be placed within a try code block to catch potential exceptions.
  • Each try or throw block must have at least one corresponding catch block.
  • Use multiple catch code blocks to catch different kinds of exceptions.
  • Exceptions can be re-thrown in the catch block within the try code.

In short: if an exception is thrown, you must catch it.

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

How do you handle exceptions effectively in PHP (try, catch, finally, throw)? How do you handle exceptions effectively in PHP (try, catch, finally, throw)? Apr 05, 2025 am 12:03 AM

In PHP, exception handling is achieved through the try, catch, finally, and throw keywords. 1) The try block surrounds the code that may throw exceptions; 2) The catch block handles exceptions; 3) Finally block ensures that the code is always executed; 4) throw is used to manually throw exceptions. These mechanisms help improve the robustness and maintainability of your code.

See all articles