zoukankan      html  css  js  c++  java
  • Golang基础——异常处理

    异常处理

    panic : 相当于 python 的 raise

    func test111() interface{} {
    	return 1 / 1
    }
    
    func main() {
    	a := test111()
    	// panic("111")  // 报错结束,致命错误,一般不用 相当于 raise
    	fmt.Println(a)
    }
    
    

    defer : 栈结构

    func main() {
        defer fmt.Println("good")  // 最后执行,必须在函数内使用
    	defer fmt.Println("world") // 后进先出,栈结构
    	// world
    	// good
    	// defer中,延迟调用函数,报错,其他代码依然执行
    
    	x := 10
    	y := 20
    	defer func() {
    	  fmt.Println(x, y)
    	}()
    	x = 100
    	y = 200
    	fmt.Println(x, y)
    	// 100 200
    	// 100 200
    
    	x := 10
    	y := 20
    	defer func(x int, y int) {
    	fmt.Println(x, y)
    	}(x, y)
    	x = 100
    	y = 200
    	fmt.Println(x, y)
    	// 100 200
    	// 10 20
    	// defer 虽然后执行,但是如果匿名函数有参数,会先传参数,再后执行。
    }
    

    recover : 相当于 try except

    func tcore(x int) {
    	var a [1]int
    	fmt.Println(a[x])
    }
    
    func tcore1(x int) { // recover 必须搭配defer使用,并且匿名函数 相当于 try except
    	defer func() { // recover 必须在defer调用的函数中使用
    		if err := recover(); err != nil { // 如果recover返回为空,说明没报错,不打印
    			fmt.Println(recover())
    		}
    	}()
    	var a [1]int
    	fmt.Println(a[x])
    }
    
    // aaa
    // runtime error: index out of range [3] with length 1
    // bbb
    
    func main() {
    	fmt.Println("aaa")
    	// tcore(3) // 运行报错结束
    	tcore1(0) // 不会报错,继续运行,recover (搭配defer使用)
    	fmt.Println("bbb")
    }
    
    

    recover() 补充

    package main
    
    import "fmt"
    
    func getitem(i int) interface{}{
    	defer func(){
    		// fmt.Println(recover())  // Println 也是取出
    		if err:=recover();err!=nil{
    			//fmt.Println(recover())  // 结果为:nil,已经赋值给err,不能再取,管道
    			fmt.Println(err)  // runtime error: index out of range
    		//	fmt.Println("aaa")
    		}
    	}()
    	arr := []int{1,2,3}
    	fmt.Println(arr[i])
        return arr[i]
    }
    
    func main() {
    	getitem(3)  // runtime error: index out of range
    	getitem(2)  // 3
    }
    
  • 相关阅读:
    C# 异步编程 (12)
    C# 动态语言扩展(11)
    C# LINQ(10)
    代码整洁之道(1)
    C# 集合(9) 持续更新
    C# 字符串和正则表达式(8) 持续更新
    C# 委托、lambda表达式和事件 (7) 持续更新
    C# 运算符和类型强制转换(6) 持续更新
    C++_将图二维矩阵形式转为邻接表结构
    .NET(C#)连接各类数据库-集锦
  • 原文地址:https://www.cnblogs.com/pythonwl/p/14664473.html
Copyright © 2011-2022 走看看