使用 go 时,有一种模式用于定义错误并以(对我而言)非常奇特的方式处理它们。通常错误声明为ErrorSomethingWentWrong = errors.New("Just an example!"). 您可以用来errors.Is(err, ErrorSomethingWentWrong)捕获该特定错误。该Is函数可以通过比较指针来做到这一点。但是为了进行比较,我需要知道哪个变量名用于定义,errorString以便我可以用来errors.Is捕获它。例如:ErrorSomethingWentWrong = errors.New("Just an example!")func DoSomething() (*Something, error) { return nil, ErrorSomethingWentWrong}我知道字符串返回了一个错误"Just an example!",但我不知道它有变量名ErrorSomethingWentWrong:func checkError() { if errors.Is(err, ErrorSomethingWentWrong){ // how to know this??? //handle error }}当我使用时,errors.Is(err, ErrorSomethingWentWrong)我可以捕获并处理这个错误。使用调试时,我看不到errorString代表ErrorSomethingWentWrong变量。但是当我不知道变量名是什么时,ErrorSomethingWentWrong我需要对代码进行逆向工程或阅读文档以了解返回了哪个错误。
1 回答
慕侠2389804
TA贡献1719条经验 获得超6个赞
如果我理解正确,这是你的场景:
您从包中收到一个错误,并且没有文档可以为您提供您应该处理的错误。您正在调试,看到一个errors.errorString,但不知道是否有可以比较的全局和公共错误值。
不幸的是,这是一个值,调试器无法告诉您这是一个全局变量还是哪个,因为您没有收到变量,只有一个值。
你可以:
通读你正在调用的包的源代码,看看返回了哪些错误以及如何处理它们
在源代码中搜索错误字符串中的文本,这可以帮助您查明定义或创建错误的位置。
如果事实证明您希望处理的特定错误未在全局范围内定义(并且重写包对您的情况不可行),那么您将无法处理它。如果有人errors.New在函数内部使用(不好的做法),就会发生这种情况。那么你也可以试试这些:
func handleError(err error) {
if err.Error() == "full error string" {}
if strings.Contains(err.Error(), "partial error string") {}
}
但那些都是丑陋的恕我直言。
TL;DR这是不可能的,你必须阅读源代码。
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报
0/150
提交
取消