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 .

©2020 ioDraw All rights reserved
Dormitory information management system JQ set up cookie(3 We'll do it in five minutes )VUE Arrangement of basic knowledge points Embedded Software Engineer 2019 Summary of school recruitment First order low pass filter - Continuous to discrete python Basic exercises ( One )Java——char Types and strings Six Star Education :PHP Programmer's book , Let you quickly become a technical master springboot+vue+shiro Function authority 【Pytorch】BCELoss and BCEWithLogitsLoss Detailed explanation of loss function