Go 自定义error错误的处理方法
作者:周伯通的麦田 发布时间:2024-02-16 09:03:45
标签:Go,自定义,error,错误
Go的error比较灵活.但是自身对error处理的机制有不太好用,我们可以自定义错误输出:
只要所有实现了Error()方法的对象都可以, 这里给个比较简单的demo,后续整理一个error的优化封装:
package main
import (
"fmt"
)
type NameEmtpyError struct {
name string
}
//NameEmtpyError实现了 Error() 方法的对象都可以
func (e *NameEmtpyError) Error() string {
return "name 不能为空"
}
func NameCheck(name string) (bool, error) {
if name == "" {
return false, &NameEmtpyError{name} // 注意error这里必须是地址&引用
}
return true, nil
}
func main() {
name := ""
if check, err := NameCheck(name); err != nil {
fmt.Println(err)
} else {
fmt.Println(check)
}
}
在go里定义错误异常的方式有这么两种,但都需要你的返回值是error类型的:
第一种方式是使用golang标准库包errors 来定义错误。使用方法很简单,只需要 return errors.New(“错误信息”) 。 这样就是一个最简单的错误返回。
第二种方式是借用struct结构体,创建一个struct的Error()方法,注意这个方法名是Error,不然会出现找不到Error方法。
下面我们看一个比较完整的Error的使用方法。不仅有errors,还有struct Error()方式.
package main
import (
"errors"
"fmt"
)
type equalError struct {
Num int
}
//方法名字是Error()
func (e equalError) Error() string {
return fmt.Sprintf("当前数字是 %d ,大于10", e.Num)
}
//使用errors.New简单生成
func Equal(n int) (int, error) {
if n > 10 {
return -1, errors.New("大于10") //生成一个简单的 error 类型
}
return n, nil
}
func DiyEqual(n int) (int, error) {
if n > 10 {
return -1, equalError{Num: n} // 会调用equalError的Error方法
}
return n, nil
}
func main() {
//使用errors.New生成error对象
if result, err := Equal(20); err != nil {
fmt.Println("错误:", err)
} else {
fmt.Println("结果:", result)
}
//不适用erros,自定义错误方式.
if result, err := DiyEqual(20); err != nil {
fmt.Println("错误:", err)
} else {
fmt.Println("结果:", result)
}
}
当然实际开发项目也不建议这么写,太lower不说,也不好扩展. 下一篇准备写个demo,封装优化错误输出的处理.
来源:https://www.cnblogs.com/phpper/archive/2021/01/10/14243506.html


猜你喜欢
- 学习python编程,首先要配置好环境变量。本文主要讲解python的环境变量配置,在不同版本下如何安装Windows打开Python官方下
- pytorch的dataloader会将数据传到GPU上,这个过程GPU的mem占用会逐渐增加,为了避免GPUmen被无用的数据占用,可以在
- 一般网站发布信息会在具体实现范围内发布,我们在进行网络爬虫的过程中,可以通过设置定时爬虫,定时的爬取网站的内容。使用python爬虫框架Sc
- 这是 小马 在交流会中的分享,可能有些朋友还不曾了解,同时也为了自己温故而知新,就整理下。多种方式可以想像得到,有很多方法立即执行匿名函数,
- 运行环境IDE丨pycharm版本丨Python3.6系统丨Windows实现目的与思路目的实现对腾讯视频目标url的解析与下载,由于第三方
- 近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁
- 一、流程分析:1.用户在项目前端,输入手机号,然后点击【获取验证码】,将手机号发到post到后台。2.后台验证手机号是否合法,是否已被占用,
- %r用rper()方法处理对象%s用str()方法处理对象相同结果有些情况下,两者处理的结果是一样的,比如说处理int型对象。例:print
- 可以直接跳到最后整体代码看一看是不是很少的代码!!!!思路:1. 数据的整合2. 图片的灰度转化3. 图片的二值转化4. 图片的轮廓识别5.
- 如何制作一个倒计时的程序? 见下:<%CountdownDate = #1/1
- 字符编码我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 本文为大家分享了JS组件Form表单验证神器BootstrapValidator,供大家参考,具体内容如下1、初级用法来看bootstrap
- php文件 <?php class xpathExtension{ public static function getNodes($
- 前言平静之下,蓦然回首,base64 却在灯火阑珊处。今天翻开旧项目发现挺多图片相关的插件都是用 base64 来显示图片的。谈到 base
- javascript版 俄罗斯方块(Russian box)小游戏,喜欢的朋友可以玩玩。对源代码感兴趣的朋友也可以研究一下。玩法介绍:可以输
- 井字棋作为我们在上学时代必玩的一款连珠游戏,你知道如何做到先手必然不会输吗?今天我们就用HTML、css、js来实现一款井字棋游戏。先看成品
- 默认情况下,Python DB API会返回不带字段的结果,这意味着你得到的是一个列表,而不是一个字典。花费一点性能代价之后,你可以返回一个
- pycharm出现no module named xlwt问题首先声明,我是初学者,今天按照书上步骤,创建Excel文件,当我的xlwt安装
- COM接口VC实现,接口: [id(1), helpstring("method Test"