写点什么

Go 语言入门 12—异常

作者:良猿
  • 2022-11-03
    湖北
  • 本文字数:1243 字

    阅读完需:约 4 分钟

Go语言入门12—异常

异常

在 go 语言开发中,没有类似try...catch的异常捕获机制,由于 go 语言中函数或方法都是可以有多个返回值的,所以通常使用的是直接在方法或者函数上对异常进行返回,然后调用这个方法或函数的地方针对返回的异常进行处理。


例如在定义函数时,可以这样写:


func test() (int, error) {...}
复制代码


这样在函数内部如果发生发生错误的情况下,直接使用 return 语句返回异常信息即可,同时在调用该函数的地方接收返回的异常并处理。


代码示例:


func main() {    value, err := test()    if err != nil {        fmt.Println("程序异常")        return    }    fmt.Println(value)}
复制代码


例如上述代码,在调用 test 函数时,接收了函数返回的值 value 和异常 err,然后通过 if 判断返回的 err 是否为空,如果返回的 err 不为空,则表示有异常,这时候就需要对异常进行处理,如果 err 为空则表示 test 函数内部没有发生异常,正常执行业务逻辑即可。


  • 如果某个函数可能会发生异常,那么在发生异常时一定要将异常通过返回值返回,异常没发生时返回 nil。

  • 如果调用的函数有返回异常,那么必须对异常进行处理。

自定义异常

上面只讲到了怎么处理异常,但是没有说明如何返回异常,如何自定义异常,下面就来详细讲解。


在 go 语言中内置了一个错误接口 error,error 接口定义如下:


type error interface {    Error() string}
复制代码


error 接口只有一个 Error()方法,该方法返回一个 string 类型,通常返回的就是错误的描述信息,在开发过程中,如果需要返回异常信息,可以通过errors.New()新建一个错误信息并返回,注意是 errors,不是 error,errors 包里面的 errorString 实现了 error 接口,源码如下:


package errors
func New(text string) error { return &errorString{text}}
type errorString struct { s string}
func (e *errorString) Error() string { return e.s}
复制代码


假设一个函数用于计算圆的面积,传入参数为半径,当传入的半径小于 0 时就返回异常信息。


代码示例:


package main
import ( "errors" "fmt")
func main() { value, err := area(-1) if err != nil { fmt.Println(err.Error()) return } fmt.Println(value)}
func area(r float32) (float32, error) { if r < 0 { return 0, errors.New("半径小于0") } return r * r * 3.14, nil}
复制代码


  1. 在 area 函数中判断传入的参数是否小于 0,当参数小于 0 时就调用 errors 包的New()函数返回异常。

  2. 在 main 函数中调用 area 函数时需要接收两个返回值,一个是计算得出的值,一个是返回的异常信息,然后通过 if 判断异常并对异常进行处理,只需要调用 err 的Error()方法就能返回异常的描述信息。


运行结果:



只需要掌握了通过errors.New方法创建异常和通过Error()打印异常信息基本就掌握了异常的基本处理方法。


errors.New方法返回一个异常信息无法对字符串进行格式化,所以还可以使用fmt.Errorf来进行格式化字符串返回,例如:


return 0, fmt.Errorf("半径小于%d", 0)
复制代码


这样可以对字符串进行格式化,处理起来更加方便灵活。


发布于: 刚刚阅读数: 3
用户头像

良猿

关注

还未添加个人签名 2019-02-13 加入

还未添加个人简介

评论

发布
暂无评论
Go语言入门12—异常_Go_良猿_InfoQ写作社区