• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > golang错误处理之error

golang错误处理之error

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了golang error,golang培训,golang移动开发,golang,golang语言等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

golang错误处理之error


golang中没有try/catch这样的异常处理机制,只能依靠返回值来做状态是否出错判断(当然它有个panic/recover机制,但一般只处理意想不到的错误)。

对于函数的返回值,惯例是最后一个参数返回error对象,来表示函数运行的状态。
如:
  1. n, err := func()
  2. if err != nil {
  3. ...//process error
  4. }
或者写在一起
  1. if n, err := func(); err != nil {
  2. ...//process error
  3. }

error对象可以由errors.New()或fmt.Errorf()构造。
如:
  1. var dividedErr = errors.New("Cant divided by 0")
或
  1. err := fmt.Errorf("%d cant divided by 0", arg)

我们先来看看error到底是什么类型。
error在标准库中被定义为一个接口类型,该接口只有一个Error()方法:
  1. type error interface {
  2. Error() string
  3. }
也就是说,自定义的结构只需要拥有Error()方法,就相当于实现了error接口。


我们可以创建一个结构体,并实现Error()方法,就能根据自己的意愿构造error对象了。
如:
  1. type division struct {
  2. arg int
  3. str string
  4. }
  5. func (e *division) Error() string {
  6. return fmt.Sprintf("%d %s", e.arg, e.str)
  7. }
  8. func divideCheck(arg1, arg2 int) (error) {
  9. if arg2 == 0 {
  10. return &division{arg1, "can't divided by 0"}
  11. }
  12. return nil
  13. }

再来看一个例子,检查一组数据中是否有不能除(即除数为0)的情况,如果有则返回出错。
代码如下:
  1. package main
  2. import "fmt"
  3. func divideCheck(arg1, arg2 int) (error) {
  4. if arg2 == 0 {
  5. return fmt.Errorf("%d can't divided by 0", arg1)
  6. }
  7. return nil
  8. }
  9. func main() {
  10. var err error
  11. err = divideCheck(4, 2)
  12. if err != nil {
  13. fmt.Println(err)
  14. return
  15. }
  16. err = divideCheck(8, 0)
  17. if err != nil {
  18. fmt.Println(err)
  19. return
  20. }
  21. }

我们实现了这个功能,但是这样的代码非常不优雅,每执行一次函数调用都至少要用3行来做错误处理。

下面来优化一下。我们需要实现的功能是,只要有一个数不能除,就返回出错。那么只需要把每次检查后的状态存储到内部状态变量里,在全部处理完成后再检查这个变量就行了。
代码如下:
  1. package main
  2. import "fmt"
  3. type division struct {
  4. err error
  5. }
  6. func (this *division)DivideCheck(arg1, arg2 int) {
  7. if this.err != nil {
  8. return
  9. }
  10. if arg2 == 0 {
  11. this.err = fmt.Errorf("%d can't divided by 0", arg1)
  12. return
  13. }
  14. }
  15. func (this *division)Err() error {
  16. return this.err
  17. }
  18. func main() {
  19. d := new(division)
  20. d.DivideCheck(4, 2)
  21. d.DivideCheck(8, 0)
  22. if d.Err() != nil {
  23. fmt.Println(d.Err())
  24. }
  25. }
这么做代码就优雅多了,并且在每次检查前都判断内部状态是否已经出错,出错就马上返回,几乎没有性能损失。


golang的错误处理是经常被诟病的地方,但如果懂得以go的方式编程,还是可以做的挺优雅的~

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • golang错误处理之error

相关文章

  • 2017-05-26Android中TextView添加删除线,androidtextview
  • 2017-05-26Android UI ListView的使用,androidlistview
  • 2017-05-26强制DataNode向NameNode上报blocks
  • 2017-05-26存储链路问题导致的RAC异常
  • 2017-05-26Android安全专项-Apk加固浅析
  • 2017-05-26MaterialRefreshLayout,swiperefreshlayout
  • 2017-05-224.4.1 ContentProvider初探
  • 2017-05-26WebView的基本使用,WebView使用
  • 2017-05-26使用 Diagwait 作为诊断工具,获取用于诊断 Oracle Clusterware 节点驱逐
  • 2017-05-26[android] 手机卫士读取联系人,android卫士

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • RadioButton与CheckBox,radiobutton
    • 第3章 用C#编写百度地图Android手机应用程序(第5讲),
    • 【lushengduan】03、点击事件的四种实现方式,lushengduan03
    • 从零开始怎么写android native service?
    • eclipse — 导入android项目后识别成java项目的问题及解决,eclipseandroid
    • 一个规范的自定义View——Android开发艺术探索笔记
    • Android版本和API Level对应关系,androidlevel
    • 如何挂载ubi文件系统
    • KeyEvent机制(按键),keyevent机制按键
    • Android开发学习——android反编译,开发android反编译

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有