GO基础之异常处理
一、异常
1、 错误指程序中出现不正常的情况,从而导致程序无法正常执行。
•大多语言中使用try... catch... finally语句执行。
假设我们正在尝试打开一个文件,文件系统中不存在这个文件。这是一个异常情况,它表示为一个错误。
2、 Go语言中没有try...catch
- • Go语言通过内置的错误类型提供了非常简单的错误处理机制。
- •错误值可以存储在变量中,通过函数中返回。
- 如果一个函数或方法返回一个错误,按照惯例,它必须是函数返回的最后一个值。
- •处理错误的惯用方式是将返回的错误与nil进行比较。
- nil值表示没有发生错误,而非nil值表示出现错误。
- •如果不是nil,需打印输出错误。
go中error的源码
package errors // New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {
return &errorString{text}
} // errorString is a trivial implementation of error.
type errorString struct {
s string
} func (e *errorString) Error() string {
return e.s
}
二、go中的异常处理

package main import (
"math"
"fmt"
"os"
"github.com/pkg/errors"
) func main() {
// 异常情况1
res := math.Sqrt(-)
fmt.Println(res) res , err := Sqrt(-)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(res)
} //异常情况2
//res = 100 / 0
//fmt.Println(res)
res , err = Divide( , )
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(res)
} //异常情况3
f, err := os.Open("/abc.txt")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(f.Name() , "该文件成功被打开!")
} } //定义平方根运算函数
func Sqrt(f float64)(float64 , error) {
if f< {
return , errors.New("负数不可以获取平方根")
} else {
return math.Sqrt(f) , nil
}
} //定义除法运算函数
func Divide(dividee float64 , divider float64)(float64 , error) {
if divider == {
return , errors.New("出错:除数不可以为0!")
} else {
return dividee / divider , nil
}
}
go中error的创建方式
//error创建方式一
func Sqrt(f float64)(float64 , error) {
if f< {
return , errors.New("负数不可以获取平方根")
} else {
return math.Sqrt(f) , nil
}
}
//error创建方式二;设计一个函数:验证年龄。如果是负数,则返回error
func checkAge(age int) (string, error) {
if age < {
err := fmt.Errorf("您的年龄输入是:%d , 该数值为负数,有错误!", age)
return "", err
} else {
return fmt.Sprintf("您的年龄输入是:%d ", age), nil
}
}
四、自定义错误
• 1、定义一个结构体,表示自定义错误的类型
• 2、让自定义错误类型实现error接口的方法:Error() string
• 3、定义一个返回error的函数。根据程序实际功能而定。
package main import (
"time"
"fmt"
) //1、定义结构体,表示自定义错误的类型
type MyError struct {
When time.Time
What string
} //2、实现Error()方法
func (e MyError) Error() string {
return fmt.Sprintf("%v : %v", e.When, e.What)
} //3、定义函数,返回error对象。该函数求矩形面积
func getArea(width, length float64) (float64, error) {
errorInfo := ""
if width < && length < {
errorInfo = fmt.Sprintf("长度:%v, 宽度:%v , 均为负数", length, width)
} else if length < {
errorInfo = fmt.Sprintf("长度:%v, 出现负数 ", length)
} else if width < {
errorInfo = fmt.Sprintf("宽度:%v , 出现负数", width)
}
if errorInfo != "" {
return , MyError{time.Now(), errorInfo}
} else {
return width * length, nil
}
} func main() {
res , err := getArea(-, -)
if err != nil {
fmt.Printf(err.Error())
} else {
fmt.Println("面积为:" , res)
}
}
GO基础之异常处理的更多相关文章
- Python 基础之 异常处理
python 基础之异常处理 说到异常处理,就得先问一下,什么是异常处理? 先来看一下,什么是异常? 异常就是:程序运行时发出的错误的信号. 异常的种类先来看一下: 一.常见的异常 Attribut ...
- c#基础之异常处理
在开发过程中,经常遇到各种各样的小问题,很多是由于基础不牢固,没有经常总结导致的.遇到重复的问题可能可根据以往经验处理,但是对问题本身引发的原因进行深入的了解.工作很多年,但是c#基础像一层冰一样,可 ...
- c#基础之异常处理及自定义异常 从SQLServer转储数据到MySQL
c#基础之异常处理及自定义异常 一.什么是c#中的异常? 异常是程序运行中发生的错误,异常处理是程序的一部分.c#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说S ...
- Python之路第八天,基础(10)-异常处理
异常处理 1. 异常基础 python3 try: pass except Exception as ex: pass while True: num1 = input('num1:') num2 = ...
- Python开发基础-Day23try异常处理、socket套接字基础1
异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解 ...
- windows内核基础与异常处理
前两日碰到了用异常处理来做加密的re题目 所以系统学习一下windows内核相关 windows内核基础 权限级别 内核层:R0 零环 核心态工作区域 大多数驱动程序 应用层:R3 用户态工作区域 只 ...
- python基础之异常处理
Python3 错误和异常 作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python有两种错误很容易辨认:语法错误和异常. ...
- Python基础、异常处理
一.概述 错误与异常概念 异常也是对象, 基于Exception类.内置异常 异常处理.流程 try/except/else 处理python或你触发的异常 try/fianlly 不管有没有异 ...
- 黑马程序员——JAVA基础之异常处理机制
------- android培训.java培训.期待与您交流! ---------- 异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式 ...
- 一天一个Java基础——通过异常处理错误
<Thinking in Java>上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来. 一.创建自定义异常 package Exception; class SimpleExc ...
随机推荐
- jQuery 判断页面对象是否存在
不能用 if($("#id")){}else{} 因为 $("#id") 不管对象是否存在都会返回 object. 正确使用判断对象是否存在应该用: if( ...
- 一文搞懂V8引擎的垃圾回收
引言 作为目前最流行的JavaScript引擎,V8引擎从出现的那一刻起便广泛受到人们的关注,我们知道,JavaScript可以高效地运行在浏览器和Nodejs这两大宿主环境中,也是因为背后有强大的V ...
- Docker系列之常用命令操作手册
目录 1.安装虚拟机 2.安装Docker 3.Docker镜像操作 4.Docker容器操作 Docker系列之常用命令操作手册 继上一篇博客Docker系列之原理简单介绍之后,本博客对常用的Doc ...
- Flask蓝图遇到的问题
欢迎加入python学习交流群 667279387 最近在使用flask开发一个业余学习项目,由于之前都是"小打小闹",整个程序都是放在一个文件夹里面的,也没有注意这个问题.这次项 ...
- Zookeeper Watcher接口
在ZooKeeper中,接口类Watcher用于表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了 ...
- 并查集 2019年8月10日计蒜客联盟周赛 K.数组
题目链接:https://nanti.jisuanke.com/t/40860 题意:给一个长度为n的数组a[],n<1e5,a[i]<1e5 三个操作: 1 x y:把所有值为x的数据改 ...
- 551. 学生出勤纪录 I
给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤纪录中不超过一个' ...
- Day 09 作业
简述定义函数的三种方式 有参函数, 无参函数, 空函数 简述函数的返回值 函数内部代码经过一系列的逻辑处理返回的结果 简述函数的参数 函数的参数分形参和实参 形参: 定义函数阶段, 括号内定义的参数, ...
- JS中的深拷贝和浅拷贝
浅拷贝 浅拷贝是拷贝第一层的拷贝 使用Object.assign解决这个问题. let a = { age: 1 } let b = Object.assign({}, a) a.age = 2 co ...
- v-if和v-show 的区别
区别 1.手段:v-if是通过控制dom节点的存在与否来控制元素的显隐:v-show是通过设置DOM元素的display样式,block为显示,none为隐藏: 2.编译过程:v-if切换有一个局部编 ...