


Is it okay to panic inside a defer function, especially when it's already panicked?
Will it have any impact when a panic occurs inside the defer function? This is a common question, especially if a panic situation has occurred. In PHP, the defer function is used to perform some cleanup operations before the current function returns. When a panic occurs, the program will stop execution immediately, and all defer functions will be executed in last-in-first-out order. Therefore, even after a panic occurs, the defer function will still be executed. This is useful for handling tasks such as resource release and error handling. No matter what happens, the defer function always executes reliably, ensuring the integrity and stability of the code.
Question content
func sub(){ defer func (){ panic(2) }() panic(1) } func main(){ defer func(){ x:=recover() println(x.(int)); }() sub() }
I tried this code and it seems that the first panic panic(1)
is "overwritten" by the second panic panic(2)
.
But is it okay to do this? Or calling a Golang function that might panic inside a defer function?
(In C, throwing an exception from a destructor is almost unacceptable. If the stack has been unwound, it will terminate the program. I wonder if panicking in a similar way would be bad in Golang.)
Solution
Yes, it’s okay. The panic caused by the delay function is not really a new special state, it just means that the panic sequence will not stop.
Your sample code also proves that it's ok, even panic()
called can be passed to recover()
The "upper" level is called to stop the delay function.
Specifications: Handling Panics:
One thing to note here is that even if you call panic()
within a delay function, all other delay functions will still run. Also, panic()
without recover()
from a deferred function would rather "wrap" the existing panic rather than "overwrite" it (although recover()
The call does only return the last panic()
call passed).
See this example:
func main() { defer func() { fmt.Println("Checkpoint 1") panic(1) }() defer func() { fmt.Println("Checkpoint 2") panic(2) }() panic(999) }
Output (try it on Go Playground):
c2e572c1c34a0369ef7989373914f540 Even if all deferred functions call panic()
, all deferred functions are executed, and the final panic sequence printed contains the values passed to all panic()
calls.
If you call recover()
within a deferred function, you will also get this "recovered" status or information in the final printout:
defer func() { recover() fmt.Println("Checkpoint 1") panic(1) }() defer func() { recover() fmt.Println("Checkpoint 2") panic(2) }()
Output (try it on Go Playground):
Checkpoint 2 Checkpoint 1 panic: 999 [recovered] panic: 2 [recovered] panic: 1 ...
The above is the detailed content of Is it okay to panic inside a defer function, especially when it's already panicked?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

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

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

OpenSSL, as an open source library widely used in secure communications, provides encryption algorithms, keys and certificate management functions. However, there are some known security vulnerabilities in its historical version, some of which are extremely harmful. This article will focus on common vulnerabilities and response measures for OpenSSL in Debian systems. DebianOpenSSL known vulnerabilities: OpenSSL has experienced several serious vulnerabilities, such as: Heart Bleeding Vulnerability (CVE-2014-0160): This vulnerability affects OpenSSL 1.0.1 to 1.0.1f and 1.0.2 to 1.0.2 beta versions. An attacker can use this vulnerability to unauthorized read sensitive information on the server, including encryption keys, etc.

Under the BeegoORM framework, how to specify the database associated with the model? Many Beego projects require multiple databases to be operated simultaneously. When using Beego...

Backend learning path: The exploration journey from front-end to back-end As a back-end beginner who transforms from front-end development, you already have the foundation of nodejs,...

The problem of using RedisStream to implement message queues in Go language is using Go language and Redis...

What should I do if the custom structure labels in GoLand are not displayed? When using GoLand for Go language development, many developers will encounter custom structure tags...

The library used for floating-point number operation in Go language introduces how to ensure the accuracy is...

Queue threading problem in Go crawler Colly explores the problem of using the Colly crawler library in Go language, developers often encounter problems with threads and request queues. �...

This article introduces how to configure MongoDB on Debian system to achieve automatic expansion. The main steps include setting up the MongoDB replica set and disk space monitoring. 1. MongoDB installation First, make sure that MongoDB is installed on the Debian system. Install using the following command: sudoaptupdatesudoaptinstall-ymongodb-org 2. Configuring MongoDB replica set MongoDB replica set ensures high availability and data redundancy, which is the basis for achieving automatic capacity expansion. Start MongoDB service: sudosystemctlstartmongodsudosys
