zoukankan      html  css  js  c++  java
  • GO编程(打卡)-Task10: 异常处理

    defer函数

    在golang中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量

    规则

    • 当defer被声明时,其参数就会被实时解析

    • defer执行顺序为先进后出

    • defer可以读取有名返回值

    package main
    
    import "fmt"
    
    // 规则一
    func a(){
    	i := 0
    	defer fmt.Println("rule1",i) // 0
    	i++
    	defer fmt.Println("rule1",i) // 1
    	return
    }
    
    // 规则二
    func b(){
    	for i := 0;i < 3;i++{
    		defer fmt.Println("rule2",i)
    	}
    }
    
    // 规则三
    func c()(i int){
    	defer func(){
    		i++
    	}()
    	return 1
    }
    func main() {
    	a()
    	b()
    	c()
    }
    

    异常处理

    package main
    
    import (
    	"fmt"
    	"errors"
    )
    
    type NotNature float64
    
    func (err NotNature) Error() string{
    	return fmt.Sprintf("自然数为大于或等于0的数: %v",float64(err))
    }
    
    func Nature(x float64)(float64, error){
    	if x < 0 {
    		return 0,NotNature(x)
    	}else{
    		return x,nil
    	}
    }
    
    func f(){
    	fmt.Println("1")
    	panic("I am a panic.")
    	fmt.Println("2")
    }
    
    func main() {
    	// error
    	// New函数返回格式为给定文本的错误
    	// 即使文本是相同的,每次对New的调用都会返回一个不同的错误值
    	err1 := errors.New("This is an error.")
    	if err1 != nil{
    		fmt.Println("(errors.New)",err1)
    	}
    	err2 := fmt.Errorf("This is an error.")
    	if err2 != nil{
    		fmt.Println("(fmt.Errorf)",err2)
    	}
    	// 自定义错误
    	fmt.Println(Nature(1))
    	fmt.Println(Nature(-1))
    	// panic
    	// panic捕捉到错误,为了程序能继续执行下去需要recover
    	fmt.Println("=======panic=======")
    	defer func(){
    		fmt.Println("我是defer里面第一个打印函数")
    		if err := recover();err!=nil{
    			fmt.Println(err)
    		}
    		fmt.Println("我是defer里面第二个打印函数")
    	}()
    	f()
    }
    

    参考

    https://github.com/datawhalechina/go-talent/blob/master/9.异常处理.md

    https://studygolang.com/articles/10167

  • 相关阅读:
    斯特林反演
    子集计数
    快速求斯特林数总结(洛谷模板题解)
    min-25筛总结
    数学笔记
    [WC2018]即时战略(LCT,splay上二分)
    [WC2018]通道(乱搞,迭代)
    Python requests 多线程抓取 出现HTTPConnectionPool Max retires exceeded异常
    Python监控服务器利器--psutil
    gevent
  • 原文地址:https://www.cnblogs.com/rn-05181226-rw/p/14166034.html
Copyright © 2011-2022 走看看