error、panic、recover、panicking

错误处理:
当程序处于错误状态可以用os.Exit(1)来中止运行
自定义错误:
err := errors.New("I am error")
用fmt创建错误(和print一个样,它会创建一个自定义error,字符串就是格式化后的字符串)
fmt.Errorf("math: square root of negative number %g", f)

运行时异常与panic

当发生运行时错误时,Go会触发运行时panic(例如数组下标越界)

panic也可以从代码中初始化
panic(MessageString)

从panic中恢复(Recover)
recover(接受panic并处理)
recover(内建函数)被用于从panic中恢复,让程序从panicking中重新获得控制权。
(panicking,程序执行panic之后的状态)
recover只能再defer修饰的函数中使用,用来取得panic传递过来的错误值。
如果正常执行,recover会返回nil。
func main() {
defer func(){
goodWay := recover()//recover接收了panic,并返回panic 的信息。
fmt.Println(goodWay)
}()
panic("I am Panic" )
}

自定义包中的错误处理(遵守准则):
1>在包内部,panic到recover的范围不允许显示的超出包范围。
2>向包的调用者返回的只能是error而不是panic。

原文地址:https://www.cnblogs.com/mcmx/p/11390877.html

时间: 2024-11-01 04:22:02

error、panic、recover、panicking的相关文章

理解Defer、Panic和Recover

刚开始的时候理解如何使用Defer和Recover有一点怪异,尤其是使用了try/catch块的时候.有一种模式可以在Go中实现和try/catch语句块一样的效果.不过之前你需要先领会Defer.Panic和Recover的精髓. 首先你需要理解defer关键字的作用,请看如下的代码: package main import ( "fmt" ) func main() { test() } func minicError(key string) error { return fmt.

Go基础系列:defer、panic和recover

defer关键字 defer关键字可以让函数或语句延迟到函数语句块的最结尾时,即即将退出函数时执行,即便函数中途报错结束.即便已经panic().即便函数已经return了,也都会执行defer所推迟的对象. 例如: func main() { a() } func a() { println("in a") defer b() println("leaving a") //到了这里才会执行b() } func b() { println("in b&qu

defer、panic和recover

1. defer(1)defer用于将某个方法或语句推迟到当前函数返回的最后一刻执行,一般用于释放某些已分配的资源.函数返回的最后一刻指的是,return语句更新返回值变量之后,函数返回之前,所以defer语句甚至可用于修改函数的返回值(函数头部命名了返回值的情况).(2)若defer语句中嵌套了多层函数调用,只是最后一层函数调用才延后执行,其他都按代码执行顺序执行,例如:defer un(trace("b")),先按代码执行顺序执行trace("b"),假设返回值

GO_05_2:Golang 中 panic、recover、defer 的用法

 函数 defer 1. 它的执行方式类似其他语言中的折构函数,在函数体执行结束后按照调用顺序的 相反顺序 逐个执行 2. 即使函数发生 严重错误 也会被执行,类似于 java 中 try{...} catch(){} finally{} 结构的 finally 3. 支持匿名函数的调用 4. 常用于资源清理.文件关闭.解锁以及记录时间等善后操作 5. 通过与匿名函数配合可在 return 之后修改函数计算结果 6. 如果函数体内某个变量作为 defer 时匿名函数的参数,则在定义 defer

go语言中使用defer、panic、recover处理异常

go语言中的异常处理,没有try...catch等,而是使用defer.panic.recover来处理异常. 1.首先,panic 是用来表示非常严重的不可恢复的错误的.在Go语言中这是一个内置函数,如果在程序中遇到异常,或者调用panic函数,程序会立即退出(除非recover).如下代码: package main import "fmt" func main() { a := 10 b := 0 c := a / b fmt.Println(c) } 程序的输出如下: ? de

日志、文件服务器(vsftp、NFS)

下面介绍的是)日志.文件服务器(vsftp.NFS.samba 一.日志 1.日志基础 (1).日志 日志 -----------记录具有一定意义的历史事件. 事件 -----------时间.事件本身的内容.事件的关键程度(级别) 最开始的日志系统为: syslog,主要记录与应用程序.内核有关的事件.klogd(与内核有关的事件).syslogd(与应用程序有关的事件). (2)rsyslog --------------现在常用的日志系统 rsyslog的特性(5个):多线程.并行记录日志

IOS-网络(GET请求和POST请求、HTTP通信过程、请求超时、URL转码)

1 // 2 // ViewController.m 3 // IOS_0129_HTTP请求 4 // 5 // Created by ma c on 16/1/29. 6 // Copyright © 2016年 博文科技. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "MBProgressHUD+MJ.h" 11 12 @interface ViewController

分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)

上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 回到顶部 安全性设置 设置客户端操作秘密 redis安装好后,默认情况下登陆客户端和使用命令操作时不需要密码的.某些情况下,为了安全起见,我们可以设置在客户端连接后进行任何操作之前都要进行密码验证.修改redis.conf进行配置. [[email protected] ~]# vi /usr/local/redis/etc/redis.conf ###

高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...

高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前的执行环境. 二.作用域 1.每个执行环境,都对应一个自己的作用域. 2.每个执行环境,都能访问上一级的父级.父父级....作用域,称为 "作用域链" 3.执行代码时,会按照标识符沿着作用域链一级一级向上查找.如果找不到,则会报错 *标志符:执行时,使用到的变量或函数 三.上下文执行过程