go 语言错误处理

go 语言错误处理

panic recover defer 最大公约数 最小公倍数

go语言中的没有try catch的。代替的是panic-recover的机制。手动编写错误提示。

举个栗子:

//求正整数a和b的最小公倍数
 package main import "fmt" 
//最小公约数 
func multiple(a, b int) int {    
   c := divisor(a, b)    
   return (a * b / c) 
} 
//最大公约数 
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输出的内容,并让其不报错。主程序中需要对使用验证的部分进行defer。

关于defer的func(){}()的问题

尝试一下

func test() {
     for i := 0; i < 3; i++ {
         defer func() {
             fmt.Println(i)
         }()
     }
 }
 func main(){
   test()
 }

输出为:


image.png

看来循环后才把i值传进去。

func test() {
     for i := 0; i < 3; i++ {
         defer func(i int) {
             fmt.Println(i)
         }(i)
     }
 }

通过(i)把值传进去。

输出:


image.png

你可能感兴趣的:(go 语言错误处理)