错误处理

概述

参考:

Defer

延缓。

关键字defer允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为return语句同样可以包含一些操作,而不是单纯地返回某个值)。

Panic

直译为恐慌,在计算机中表示产生严重错误

当发生像数组越界或类型断言失败这样的严重错误时,会触发panic: runtime error运行时恐慌伴随着程序的崩溃输出一个runtime.Error接口类型的值。这个错误值有个RuntimeError()方法用于区别普通错误。

在多层嵌套的函数调用中调用panic,可以马上终止当前函数的执行,所有的defer语句都会保证执行并把控制权交还给接收到panic的函数调用者。这样向上冒泡直到最顶层,并执行(每层的)defer,在栈顶处程序崩溃,并在命令行中用传给panic的值报告错误情况:这个终止过程就是panicking。

Recover

恢复。这个Recover内建函数被用于从panic或错误场景中恢复:让程序可以从panicking重新获得控制权,停止终止过程进而恢复正常执行。recover只能在defer关键字的函数中使用,用于取得panic调用中传递过来的错误值,如果是正常执行,调用recover会返回nil,且没有其他效果

有一个简单的 parse 包(示例 13.4)用来把输入的字符串解析为整数切片;这个包有自己特殊的 ParseError。当没有东西需要转换或者转换成整数失败时,这个包会 panic(在函数 fields2numbers 中)。但是可导出的 Parse 函数会从 panic 中 recover 并用所有这些信息返回一个错误给调用者。为了演示这个过程,在 panic_recover.go 中 调用了 parse 包(示例 13.4);不可解析的字符串会导致错误并被打印出来。


最后修改 April 3, 2024: update, oop, network analysis (2e227df5)