Programming languages generally have exception trapping mechanisms , stay Python in It's using raise and try-except Statement to achieve exception throw and exception capture .
stay Golang
in , There are a lot of routine mistakes , It can be alerted in advance during the compilation phase , Such as grammatical errors or type errors , But some errors can only occur after the program is running , For example, array access is out of bounds , Null pointer reference, etc , These runtime errors cause the program to exit .
Of course, it can trigger the shutdown and exit of the program , It can be us , For example, through inspection and judgment , When the current environment does not meet the expected conditions for our program ( For example, a service specifies that the listening port is occupied by other programs ), It can be triggered manually
panic, Let the program exit and stop running .
<>1. trigger panic
Manually trigger downtime , It's a very simple thing , Just call panic This built-in function is enough , It's like this
package main func main() { panic("crash") }
After operation , Direct error reporting and downtime
$ go run main.go go run main.go panic: crash goroutine 1 [running]: main.main()
E:/Go-Code/main.go:4 +0x40exit status 2
<>2. capture panic
An exception has occurred , Sometimes you have to catch it , It's like Python Medium except equally , that Golang How did China do it ?
This leads to another built-in function – recover, It allows programs to be reborn after a crash .
however recover Use of , There is one condition , It has to be in the defer Function , Under other scopes , It doesn't work .
This is a simple example
import "fmt" func set_data(x int) { defer func() { // recover()
You can capture the panic Information printing if err := recover(); err != nil { fmt.Println(err) } }() //
Deliberately creating array out of bounds , trigger panic var arr [10]int arr[x] = 88 } func main() { set_data(20) //
If we can carry out this sentence , explain panic Caught // Subsequent programs can continue to run fmt.Println("everything is ok") }
After operation , The output is as follows
$ go run main.go runtime error: index out of range [20] with length 10
everything is ok
Generally speaking , It's not right to enter panic The down program does anything , But sometimes , We need to be able to recover from downtime , At least we can do that before the program crashes , Do something about it , for instance , When web
When the server encounters unexpected serious problems , All connections should be closed before crashing , If nothing is done , This will keep the client waiting , If web
The server is still in development , The server can even feed back the abnormal information to the client , Help debug .
<>3. Cannot cross collaboration
From the example above , You can see , even if panic Will cause the entire program to exit , But before we quit , If so defer Delay function , Still have to finish defer .
But this one defer There is no effect between multiple coroutines , Trigger in the subprocess panic, You can only trigger the defer, It cannot be called main In the process defer
Functional .
Just do an experiment
import ( "fmt" "time" ) func main() { // this defer It will not be enforced defer fmt.Println("in
main") go func() { defer println("in goroutine") panic("") }() time.Sleep(2 *
time.Second) }
The output is as follows
in goroutine panic: goroutine 6 [running]: main.main.func1()
E:/Go-Code/main.go:12 +0x7b created by main.main E:/Go-Code/main.go:10 +0xbc
exit status 2
<>4. To sum up
Golang Exception throwing and catching , Depends on two built-in functions :
* panic: Throw an exception , Crash the program
* recover: Catch exception , Resume procedures or close out work
revocer After calling , Thrown out panic It will end here , No more throwing , however recover, It can't be used arbitrarily , It has mandatory requirements , It has to be in defer
Only by doing so can we make full use of it .
Technology