<meta charset="utf-8">
go 語言錯(cuò)誤處理
panic recover defer 最大公約數(shù) 最小公倍數(shù)
go語言中的沒有try catch的婿滓。代替的是panic-recover的機(jī)制。手動(dòng)編寫錯(cuò)誤提示。
舉個(gè)栗子:
//求正整數(shù)a和b的最小公倍數(shù)
package main import "fmt"
//最小公約數(shù)
func multiple(a, b int) int {
c := divisor(a, b)
return (a * b / c)
}
//最大公約數(shù)
func divisor(a, b int) int {
var r int
fmt.Println(a, "%", b, "=", a%b)
for {
r = a % b
if r != 0 {
a = b
b = r
} else {
break
}
}
return b
}
func main() {
fmt.Println("aa")
var a, b int
fmt.Scanf("%d,%d", &a, &b)
defer func() {
if err := recover(); err != nil {
fmt.Println("異常退出", err)
} else {
fmt.Println(multiple(a, b))
}
}()
f(a, b)
}
//判定不能a>b
func f(a, b int) {
if a > b {
panic("a不能大于b")
}
}
為了能捕捉到 panic輸出的內(nèi)容璧尸,并讓其不報(bào)錯(cuò)。主程序中需要對(duì)使用驗(yàn)證的部分進(jìn)行defer懊烤。
關(guān)于defer的func(){}()的問題
嘗試一下
func test() {
for i := 0; i < 3; i++ {
defer func() {
fmt.Println(i)
}()
}
}
func main(){
test()
}
輸出為:
image.png
看來循環(huán)后才把i值傳進(jìn)去矗愧。
func test() {
for i := 0; i < 3; i++ {
defer func(i int) {
fmt.Println(i)
}(i)
}
}
通過(i)把值傳進(jìn)去灶芝。
輸出:
image.png