我们在使用Golang时,不可避免会遇到异常情况的处理,与Java、Python等语言不同的是,Go中并没有try...catch...这样的语句块,这个时候我们如何才能更好的处理异常呢?本文来教你正确方法
−
目录
- 前言
- error
- 调用栈
前言
在Go
的编程中, error
的使用场景数不胜数, 主要就是用来处理各种异常情况.
长久以来, 我的使用方式都是这样的:
1 2 3 4 |
|
简单易懂.
但是, 如果我们的调用链是这样的func1 -> func2 -> func3 -> func4 -> func5
, 此时func5
发生错误, error
逐层向上传递, func1
拿到错误后, 因为缺少堆栈信息, 很难根据error
还原出错场景.
那么, 根据这个问题, 又该如何处理呢? 很简单, 函数拿到error
后, 在其中添加当前上下文信息后再返回不就行了么? 类似于这样:
1 2 3 4 5 6 7 |
|
这当然可以. 但是上层还可能根据不同的error
进行不同的异常处理, 这样的话, 使用err == SameErr
的判断条件就不好使了.
那么, 如何能够在error
中添加信息的同时, 又不丢失原始error
的信息呢?
其实, 官方已经做好了类似的支持.
error
在Go
的fmt
库中有这样一个error
:
1 2 3 4 5 6 7 8 9 10 |
|
它提供了一个Error
方法来实现error
接口, 同时还会保存原始的err
信息, 可以通过Unwrap
获得. 这不就是我们需要得么?
官方对其的使用进行了封装, 包含了:
- 对异常进行包装
- 判断指定异常是否存在与包装链中
- 从包装链中提取指定类型的异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
翻了翻几个方法的源码都比较简单, 在这里就不细述了.
调用栈
但是, 这样一层一层将调用信息返回去, 还是有些麻烦, 有没有什么办法, 能够直接将调用栈放进去呢? 或者说, 在Go
中如何获取调用栈呢?
1 2 3 4 5 6 7 8 9 10 |
|
OK, 所谓大道至简, error
也就这么点东西, 完全能够满足使用了. 再见
到此这篇关于Golang error使用场景介绍的文章就介绍到这了,更多相关Go error内容请搜索51CTO以前的文章或继续浏览下面的相关文章希望大家以后多多支持51CTO!