Home Backend Development PHP Tutorial In-depth analysis of the exception mechanism of PHP principles_PHP tutorial

In-depth analysis of the exception mechanism of PHP principles_PHP tutorial

Jul 21, 2016 pm 03:34 PM
array php principle Can exist abnormal what is mechanism In-depth analysis independent of

What is the principle of PHP's exception mechanism?

What is the ZEND_HANDLE_EXCEPTION at the end of each independently executable op array in PHP used for?

Let's start with a question, last week When, blue5tar asked a question: "For the following code, onError is obviously executed, but onException is not executed, why?".

Copy code The code is as follows:

function onError($errCode, $errMesg, $errFile, $errLine) {
echo "Error Occurredn";
throw new Exception($errMesg);
}

function onException($e) {
echo $e->getMessage();
}

set_error_handler( "onError");

set_exception_handler("onException");

/* I never name a file after me, so this file doesn't exist*/
require(" laruence.php");

Run result:
Copy code The code is as follows:

Error Occurred
PHP Fatal error: main(): Failed opening required 'laruence.php

First of all, we need to know that when Require contains a problem that cannot be found, it will be thrown forward and backward Two errors occurred,
Copy code The code is as follows:

1. WARNING: thrown when PHP tries to open this file Out.
2. E_COMPILE_ERROR: Throws after failure returns from the PHP file opening function

And we know that set_error_handler cannot capture the E_COMPILE_ERROR error:

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

So, in onError, only The first WARNING error can be caught, but why is the exception thrown in onError not caught by the default exception_handler?

This is about PHP’s exception mechanism.

Understand opcode (Students who have a deep understanding of PHP principles and Opcodes all know that before PHP5.3, the last opcode of every op array (file, function, method) that can be run independently is ZEND_HANDLE_EXCEPTION, and what is this opcode used for? What?

It turns out that in PHP, when an exception is thrown, it will jump to the last line of each op array to execute this ZEND_HANDLE_EXCEPTION. The pseudo code is as follows:
Copy code The code is as follows:

void on_throw_exception(zval *exception TSRMLS_DC) {
1. Determine whether an exception has been thrown
2. Record exception
3. Record the serial number of the next op line to be executed
4. The serial number of the next op line to be executed = the last one of the current op array
}

Well, just like rewriting the ip register, rewriting the sequence number of the next op line to be executed changes the flow of the program. In this way, it will enter the processing logic of ZEND_HANDLE_EXCEPTION.

And in ZEND_HANDLE_EXCEPTION, It will determine whether this exception is in try catch,

Copy the code The code is as follows:

If so, put the following An op line to be executed is set as the first catch op line and continues execution.
If not, destroy some unnecessary variables and opline, and then directly end the execution process

Some students may ask: "When will the default exception handling function (user_exception_handler) set by set_exception_handler take effect?"

Well, it is determined whether there is default exception handling after the execution is completed and the LOOP is exited. Function, only call it if available:

Copy code The code is as follows:

//Execute
zend_execute( EG(active_op_array) TSRMLS_CC);
if (EG(exception)) {
if (EG(user_exception_handler)) {
Call the user-defined default exception handler function
} else {
Not Caught exception
}
} else {
No exception
}
destroy_op_array(EG(active_op_array) TSRMLS_CC);
efree(EG(active_op_array));

In-depth analysis of the exception mechanism of PHP principles_PHP tutorial
PHP exception process
When PHP encounters a Fatal Error, it will directly zend_bailout, and zend_bailout will cause the program flow to directly skip the above code segment, which can also be understood as direct exit ( longjmp), which results in user_exception_handler not having a chance to work.

After understanding this, I think the reason for the problem at the beginning of the article is very clear, right?

Finally, regarding ZEND_HANDLE_EXCEPTION, Some students may have questions: If this is the case, then why does every independently executable op array end up with this ZEND_HANDLE_EXCEPTION? The simplest, if there is no throw in a function, then this opcode is obviously unnecessary? Hehe, you are very smart. Starting from PHP 5.3, it has been adjusted according to your ideas. Only at the throw moment, the ZEND_HANDLE_EXCEPTION opline will be dynamically generated.

PHP5 changelog:

Changed exception handling . Now each op_array doesn't contain ZEND_HANDLE_EXCEPTION opcode in the end. (Dmitry)

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/322299.htmlTechArticleWhat is the principle of PHP’s exception mechanism? The ZEND_HANDLE_EXCEPTION at the end of each independently executable op array in PHP is used What are you here for? Let’s start with a question. Last week,...
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

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

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

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 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

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,

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

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.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles