一、异常

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基础之异常处理的更多相关文章

  1. Python 基础之 异常处理

    python 基础之异常处理 说到异常处理,就得先问一下,什么是异常处理?  先来看一下,什么是异常? 异常就是:程序运行时发出的错误的信号. 异常的种类先来看一下: 一.常见的异常 Attribut ...

  2. c#基础之异常处理

    在开发过程中,经常遇到各种各样的小问题,很多是由于基础不牢固,没有经常总结导致的.遇到重复的问题可能可根据以往经验处理,但是对问题本身引发的原因进行深入的了解.工作很多年,但是c#基础像一层冰一样,可 ...

  3. c#基础之异常处理及自定义异常 从SQLServer转储数据到MySQL

    c#基础之异常处理及自定义异常 一.什么是c#中的异常? 异常是程序运行中发生的错误,异常处理是程序的一部分.c#中的异常类主要是直接或者间接的派生于 System.Exception类 ,也就是说S ...

  4. Python之路第八天,基础(10)-异常处理

    异常处理 1. 异常基础 python3 try: pass except Exception as ex: pass while True: num1 = input('num1:') num2 = ...

  5. Python开发基础-Day23try异常处理、socket套接字基础1

    异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解 ...

  6. windows内核基础与异常处理

    前两日碰到了用异常处理来做加密的re题目 所以系统学习一下windows内核相关 windows内核基础 权限级别 内核层:R0 零环 核心态工作区域 大多数驱动程序 应用层:R3 用户态工作区域 只 ...

  7. python基础之异常处理

    Python3 错误和异常 作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python有两种错误很容易辨认:语法错误和异常. ...

  8. Python基础、异常处理

    一.概述 错误与异常概念 异常也是对象, 基于Exception类.内置异常 异常处理.流程 try/except/else  处理python或你触发的异常 try/fianlly   不管有没有异 ...

  9. 黑马程序员——JAVA基础之异常处理机制

    ------- android培训.java培训.期待与您交流! ---------- 异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式 ...

  10. 一天一个Java基础——通过异常处理错误

    <Thinking in Java>上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来. 一.创建自定义异常 package Exception; class SimpleExc ...

随机推荐

  1. css练习——两列左窄右kuan型

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. 转:Spring配置文件<context:property-placeholder>标签使用漫谈

    <context:property-placeholder>标签提供了一种优雅的外在化参数配置的方式,不过该标签在Spring配置文件中只能存在一份!!! 众所周知,Spring容器是采用 ...

  3. shell 数组作为函数形参

    问题描述: 把字符串tarFile和数组slaves_hostIP传入函数processArray中并输出结果. #!/bin/bash function processArray() { tarFi ...

  4. Java修炼——四种方式解析XML_DOM

    四种方式解析XML:DOM      JDOM   DOM4J    SAX 先写一个XML栗子: <?xml version="1.0" encoding="UT ...

  5. Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录

    首先我们需要客户端和服务器端. 服务器端需要:1.创建ServerSocket对象.2.监听客户端的请求数据.3.获取输入流(对象流)即用户在客户端所发过来的信息.                  ...

  6. Java修炼——文件夹的复制

    文件夹的复制用到了俩个流:缓冲流和文件字节流 缓冲流用来加快写入和读取速度. 在这里我简述一下复制文件夹的过程,当然复制文件夹都可以,复制文件更是不在话下 1.首先要明确俩点.要复制的文件夹的位置(源 ...

  7. Balls in the Boxes

    Description Mr. Mindless has many balls and many boxes,he wants to put all the balls into some of th ...

  8. Day 09 作业

    简述定义函数的三种方式 有参函数, 无参函数, 空函数 简述函数的返回值 函数内部代码经过一系列的逻辑处理返回的结果 简述函数的参数 函数的参数分形参和实参 形参: 定义函数阶段, 括号内定义的参数, ...

  9. 【JS】370- 总结异步编程的六种方式

    点击上方"前端自习课"关注,学习起来~ 作者:Aima https://segmentfault.com/a/1190000019188824 众所周知 JavaScript 是  ...

  10. 【Feign】@FeignClient相同名字错误 The bean 'xxx.FeignClientSpecification', defined in null, could not be registered

    The bean 'xxx.FeignClientSpecification', defined in null, could not be registered. A bean with that ...