下面是关于"Go语言异常panic和恢复recover用法实例"的详细攻略。
异常和panic
异常
异常是程序的非正常事件。当程序出现异常时,程序运行将被中断,控制流将进入一个异常处理程序来处理异常并防止程序崩溃。Go语言中的异常被称为panic。
panic
在Go语言中,panic函数被用于引发异常。当程序执行到panic()函数时,程序将会停止执行当前的函数,弹出当前函数的堆栈,并在调用它的函数中执行panic()函数的应急处理程序。
下面是一个panic的例子:
package main
import "fmt"
func main() {
fmt.Println("Starting routine...")
panic("Something went wrong.")
fmt.Println("Before exit...")
}
在通过调用panic中断程序之后,fmt.Println将不会被执行,程序将立即停止。
恢复和recover
Go语言提供了recover()函数来捕获并处理panic异常,从而防止程序在异常处理程序中崩溃。
recover
recover()函数返回一个interface{}类型的值,该值包含引发panic时传递给panic函数的值。如果当前程序没有发生panic,recover()将会返回nil。
下面是recover的例子:
package main
import "fmt"
func main() {
fmt.Println("Starting routine...")
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic: ", r)
}
}()
panic("Something went wrong.")
fmt.Println("Before exit...")
}
上面的代码中有一个defer语句,它的作用是在函数返回之前执行。使用recover()函数和defer语句,程序可以从panic中恢复,并在恢复之后执行其他语句。
示例
下面是两个示例,其中一个示例展示了如何通过recover()函数从panic中恢复并继续执行程序,另一个示例展示了如何通过创建自定义error类型和panic函数来抛出异常。
示例1:使用recover()从panic中恢复
package main
import "fmt"
func divide(x, y int) (result int, err error) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic: ", r)
err = fmt.Errorf("%v", r)
}
}()
if y == 0 {
panic("divide by zero")
}
result = x / y
return result, nil
}
func main() {
fmt.Println("Starting routine...")
result, err := divide(10, 5)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", result)
result, err = divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", result)
fmt.Println("Before exit...")
}
在上面的代码中,除法运算将会发生panic,但是通过使用recover()函数和defer语句,程序可以从panic中恢复,并在恢复之后继续执行程序。
示例2:创建自定义error类型和panic函数抛出异常
package main
import "fmt"
type MyError struct {
ErrCode int
ErrMsg string
}
func (e *MyError) Error() string {
return fmt.Sprintf("%d: %s", e.ErrCode, e.ErrMsg)
}
func divide(x, y int) (result int, err error) {
if y == 0 {
err = &MyError{ErrCode: 1, ErrMsg: "divide by zero"}
panic(err)
}
result = x / y
return result, nil
}
func main() {
fmt.Println("Starting routine...")
result, err := divide(10, 5)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", result)
result, err = divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", result)
fmt.Println("Before exit...")
}
在上面的代码中,如果除数是0,程序将会抛出一个自定义的error类型的异常,并通过panic函数来实现。程序可以通过在主函数中捕获该异常,并在捕获之后继续执行程序。
以上就是关于"Go语言异常panic和恢复recover用法实例"的详细攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:go语言异常panic和恢复recover用法实例 - Python技术站