Java转Go—13异常处理

异常

在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.14nil
}
  1. 在area函数中判断传入的参数是否小于0,当参数小于0时就调用errors包的New()函数返回异常。
  2. 在main函数中调用area函数时需要接收两个返回值,一个是计算得出的值,一个是返回的异常信息,然后通过if判断异常并对异常进行处理,只需要调用err的Error()方法就能返回异常的描述信息。

运行结果:

Java转Go—13异常处理
运行结果

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

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

return 0, fmt.Errorf("半径小于%d"0)

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


原文始发于微信公众号(良猿):Java转Go—13异常处理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/215819.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!