为了账号安全,请及时绑定邮箱和手机立即绑定

如何知道变量名继承go error

如何知道变量名继承go error

Go
婷婷同学_ 2023-03-15 14:45:23
使用 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这是不可能的,你必须阅读源代码。


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信