Golang错误处理方式异常与error

目录
  • 一、异常
  • 二、错误

Go 提供了两种处理错误 方式,

一 种是借助 panic和 recover 的抛出捕获机制,

另一种使用error 错误类型

一、异常

1、go没有try/catch,而是使用panic/recover。

panic包出异常,后续代码不再执行

recover再defer中捕获异常,使groutine(即程序)能够正常退出。

1)只有panic,而没有recover,程序宕机无法正常退出

package main
import "fmt"
func send(a, b int) int {
	if b == 0 {
		panic("wrong div")
	}
	c := a / b
	return c
}
func main() {
	defer func() {
		fmt.Println("wrong")
	}()
	send(1, 0)
}

执行结果:错误

2) 正确情况,使用panic、recover

package main
import "fmt"
func send(a, b int) int {
	if b == 0 {
		panic("wrong div")
	}
	c := a / b
	return c
}
func main() {
	defer func() {
		fmt.Println("wrong")
		if err := recover(); err != nil {
			fmt.Println(err) // 这里的err其实就是panic传入的内容
		}
	}()
	send(1, 0)
	fmt.Println("end")
}

执行结果:正常退出

2、panic被触发的情况

1)用户显视调用panic

2)go内部自动检测出空指针、数组越界等情况,会隐式报出panic,不需要用户主动调用

隐式例子如下:其实程序会自动抛出异常,不需要写panic语句

package main
import "fmt"
func send(a, b int) int {
	c := a / b
	return c
}
func main() {
	defer func() {
		fmt.Println("wrong")
		if err := recover(); err != nil {
			fmt.Println(err) // 这里的err其实就是panic传入的内容
		}
	}()
	send(1, 0)
	fmt.Println("end")
}

二、错误

如果使用panic,最主要的是“报panic之后的函数都不会被执行,由defer recover”

那么对于服务使用panic,那后面的业务就都不被执行了,那假如这其实是个我自己写的小错误呢?

比如:我的程序不允许我自定义的变量为空,为空的话我难道直接panic?那假如我程序还有别的接口逻辑假如没用到这个变量呢?直接panic岂不是服务挂了。

所以其实我能日志报出来这个错误就行了——error

https://segmentfault.com/q/1010000020000806

go提供了接口类型error:

type error interface {
	Error() string
}

故自定义错误需要实现接口中的方法。

需要注意,方法的接受者如果是值,则调用相当于进行值拷贝,对副本进行修改不会改变原值

方法的接受者是引用,相当于传递的是变量的地址,原变量值才会被修改

package main
import "fmt"
type getName interface {
	printName()
	changeName()
	changeName2()
}
type dog struct {
	name string
	age  int
}
type cat struct {
	name string
	age  string
}
func (d dog) printName() {
	fmt.Println(d.name)
}
func (d dog) changeName() {
	d.name = "d2"
}
func (d *dog) changeName2() {
	d.name = "d2"
}
func (c cat) printName() {
	fmt.Println(c.name)
}
func main() {
	d := &dog{
		name: "d1",
		age:  1,
	}
	d.printName()
	d.changeName()
	fmt.Println("changeName", d.name)
	d.changeName2()
	fmt.Println("changeName2", d.name)
}

到此这篇关于Golang错误处理方式异常与error的文章就介绍到这了,更多相关Go异常与error内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go错误和异常CGO fallthrough处理教程详解

    目录 fallthrough 代码示例 执行结果 CGO 错误&异常 处理错误:error 处理异常:panic&recover panic&defer defer执行顺序 总结 对比Java.C++ 错误异常互相转换 fallthrough 在一个 switch 块内,每个 case 无需声明 break 来终止,如果想顺序执行使用fallthrough: 如果我们想强制执行满足条件case的后一个case,也可以通过设置fallthrough的方式: 代码示例 package

  • Go语音开发中常见Error类型处理示例详解

    目录 前言 透明错误处理策略 带来的问题 哨兵(Sentinel)错误处理策略 带来的问题 1.对errors.Error()的依赖 2.定义的错误类型会被公开 Error types 带来的问题 不透明错误处理策略(Opaque errors) 带来的问题 总结 前言 上文我们了解了 Error 在Go 中的设计理念.单从理念上来看, Error 的设计似乎有利于逻辑处理.但实际上,在开发过程中,我们还会遇到各种各样的困难.为了优化开发的流程,开发者们发明了很多处理 Error 的做法.今天我

  • Go error的使用方式详解

    目录 概述 error使用方式 1.直接判等 2.组合error接口,构建更强大的error接口 3.Errno模式 4.Go1.13的Wrap模式 5. Go版本低时的链式error 概述 当我们需要在Go项目中设计error,就不得不先知道Go error几种常用方法.标准库是一个非常好的学习方式,除此之外Go1.13的errors特性也需要掌握. error使用方式 1.直接判等 这里的判等又分为变量判等和类型判等.适用于pkg中预先定义好了多个error变量或类型,err只可能是这些变量

  • Go语言error的设计理念及背景演化详解

    目录 背景 各语言中 Error 的演化 C语言 C++ Go 中 Error 的理念 1. 区分 Error 和 Exception 2.Error是一个接口 总结 背景 作为一门相对新兴的语言,Go 可以说是站在巨人的肩膀上.从 Go 语法上,我们可以看出设计者对其有许多严肃的思考.其中 Error 的处理就是极具标志性的一项. 值得注意的是,Go 中的 Error 一直是一个有争议的内容.很多议案不断的提出又推翻,即便是官方的 error 库也在多个版本中不断迭代.本文内容基于 1.19.

  • Go语言学习笔记之错误和异常详解

    目录 错误 异常 总结 错误 Go 语言通过内置的错误接口提供了非常简单的错误处理机制,Error 类型是一个接口类型. type error interface { Error() string } 可以在编码中通过实现 error 接口类型来生成错误信息. 函数通常在最后的返回值中返回错误信息. // 定义一个 DivideError 结构 type DivideError struct { dividee int divider int } // 实现 `error` 接口 func (d

  • Go中的错误和异常处理最佳实践方法

    目录 错误 认识错误 自定义错误 实现原理 异常 认识异常 处理异常 异常处理原则 异常处理实践 错误 认识错误 在Go中,错误是一种表示程序错误状态.包含了在程序在运行时.编译时的状态信息.一般我们在编写Go代码中,都会碰到如下的处理方式. file, err := os.Create("test.txt") fmt.Println(file) if err != nil { fmt.Println(err) return } 我们使用os库创建一个名为test.txt的文件,该方法

  • 一文教你如何优雅处理Golang中的异常

    我们在使用Golang时,不可避免会遇到异常情况的处理,与Java.Python等语言不同的是,Go中并没有try...catch...这样的语句块,我们知道在Java中使用try...catch...这种模式不仅能分离的错误与返回值和参数,也提供了结构化处理异常的可能,通过面向对象的思想,我们可以自定义错误类.子类,它们又可以包装其他错误,确保错误上下文不会丢失.但是在Go中,异常是作为函数返回值,返回给调用方的,这个时候我们如何才能更好的处理异常呢? 对于异常的处理,我们应该把握三个原则:

  • Golang错误处理方式异常与error

    目录 一.异常 二.错误 Go 提供了两种处理错误 方式, 一 种是借助 panic和 recover 的抛出捕获机制, 另一种使用error 错误类型 一.异常 1.go没有try/catch,而是使用panic/recover. panic包出异常,后续代码不再执行 recover再defer中捕获异常,使groutine(即程序)能够正常退出. 1)只有panic,而没有recover,程序宕机无法正常退出 package main import "fmt" func send(

  • Golang 错误捕获Panic与Recover的使用

    目录 一.Golang 错误是什么? 二.错误校验 1.方法 2.判断错误 三.错误捕获 1.方法 2.defer 的使用 总结 一.Golang 错误是什么? 对于Go语言(Golang)的错误是通过返回值的方式,来强迫调用者对错误进行处理,要么你通过 _ 忽略,要么你处理.对于这种设计方式,我们通常需要会写大量的 if err != nil 判断.我们可以通过方法来做到校验. 这类代码非常的多,尽管工程中 error 大部分都是nil,也就是没有任何错误,但是非nil的时候,就意味着错误就出

  • 窥探Swift编程中的错误处理与异常抛出

    在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中是如何抛出异常的.在编译型语言中,错误一般分为编译错误和运行时错误.我们平时在代码中处理的错误为运行时错误,我们对异常进行处理的操作的目的是为了防止程序出现错误而导致其他的副作用,比如用户数据未保存等等. 在今天的文章中,先给出主动产生异常的几种情况,然后再给出如何处理被动异常. 一.主动退出程序的几种

  • SpringBoot多种自定义错误页面方式小结

    目录 以前web.xml方式 SpringBoot中实现方式 1.实现EmbeddedServletContainerCustomizer的bean 2.通过拦截器方式 3.自定义静态error页面方法 在项目中为了友好化,对于错误页面,我们常常会使用自定义的页面.SSM框架组合时代,我们通常通过拦截或者在web.xml中设置对于错误码的错误页面,然而到了SpringBoot,web.xml消失了,SpringBootServletInitializer初始化servlet代替了web.xml.

  • laravel接管Dingo-api和默认的错误处理方式

    接管Dingo-api的错误 如上图所示,AppServiceProvider.php中的register()方法中添加如下代码 \API::error(function (\Illuminate\Validation\ValidationException $exception){ $data =$exception->validator->getMessageBag(); $msg = collect($data)->first(); if(is_array($msg)){ $msg

  • JavaScript中async await更优雅的错误处理方式

    目录 背景 为什么要错误处理 async await 更优雅的错误处理 小结 总结 背景 团队来了新的小伙伴,发现我们的团队代码规范中,要给 async  await 添加 try...catch.他感觉很疑惑,假如有很多个(不集中),那不是要加很多个地方?那不是很不优雅? 为什么要错误处理 JavaScript 是一个单线程的语言,假如不加 try ...catch ,会导致直接报错无法继续执行.当然不意味着你代码中一定要用 try...catch 包住,使用 try...catch 意味着你

  • HTTP 错误 500.19 - Internal Server Error解决办法详解

    HTTP 错误 500.19 - Internal Server Error 最近做项目出现了这个错误,经过同事之间的讨论未能解决,之后百度一下找到了解决方法,这里就说下希望大家遇到这种错误可以顺利解决. 无法访问请求的页面,因为该页的相关配置数据无效.如下图:  解决方法,到站点目录的属性,安全标签,添加用户(Everyone),并给修改权限: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 三种Golang数组拷贝方式及性能分析详解

    目录 测试 测试代码 测试结果 原理分析 copy append 总结 在Go语言中,我们可以使用for.append()和copy()进行数组拷贝,对于某些对性能比较敏感且数组拷贝比较多的场景,我们可以会对拷贝性能比较关注,这篇文件主要是对比一下这三种方式的性能. 测试 测试条件是把一个64KB的字节数组分为64个块进行复制. 测试代码 package test import ( "testing" ) const ( blocks = 64 blockSize = 1024 ) v

  • Redis 异常 read error on connection 的解决方案

    目录 一.造成原因与场景 二.出现原因 1)原因1 使用了已经断开的连接 2)原因2:执行超时 三.解决方案 1)如果是原因1 2)如果是原因2:修改超时时间 一.造成原因与场景 在接口连接 redis 时,使用了 pconnect 进行 redis 长连接,在 Redis->auth() 中抛出异常: PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection' 注:由于

  • PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法

    其实,这是一个非常容易解决掉的问题.在我看来,似曾相识,呵呵,最近学JavaScript可是学会了使用var声明变量. 其实,在PHP中根本不需要使用var声明的,但是当一个变量作为一个类的成员变量的时候,使用var还是没有问题的. 在外部使用var就报错Parse error: syntax error, unexpected T_VAR in...,例如我的出错信息: Parse error: syntax error, unexpected T_VAR in D:\Apache2.2\ht

随机推荐