如何在golang中的字符串中获取错误消息?

sha*_*raj 39 go

我提到了这个问题 - os.Error - 字符串值(Golang),但在我的情况下这不起作用.

func (t Trans) TicketQty() (intQty int, err string) {
  defer func() {    
    str := recover()
    if(str != nil){     
      err = "an error"
    }
  }()   
  Qty := t.TransObject["qty"].(map[string] interface{})["ticket fv"].(float64)  
  intQty = 10
  return 
}
Run Code Online (Sandbox Code Playgroud)

在那里err我需要抛出的错误消息,例如,如果解析逻辑失败,它会自动抛出错误.这是我需要抓住的错误.我只是举例说明 - 无论运行时异常是什么,我都需要捕获它并err在返回时传递.

怎么实现呢?

Int*_*net 84

使用该errors包创建新错误.

err = errors.New("an error")
Run Code Online (Sandbox Code Playgroud)

通过访问err.Error()或使用fmt包函数(例如fmt.Println(err)),可以将返回的错误视为字符串.

recover除非你真的知道自己在做什么,否则不要使用.返回所有错误并在它们出现时处理它们是惯用的.

有关详细信息,请参阅错误处理和Go,以及De go,Panic和Recover on the Go博客.

编辑:

重新阅读您的问题,看起来您正在尝试从可能的失败类型断言中恢复.在这种情况下,建议使用"逗号,确定"的习惯用法(在文档的先前链接部分中提到),其中(稍微解释为更一般)意味着:

"如果类型断言失败,[接收器变量]仍然存在并且类型为[无论什么被断言],但它将具有零值......"

测试一个interface{}实际上是一个float64直通类型断言的简单示例,如果失败则产生自定义错误(而不是恐慌):

package main

import (
    "errors"
    "fmt"
)

// assertFloat64 attempts a type assertion to float64.
// It returns a custom error if it fails.
func assertFloat64(n interface{}) error {
    // Type assertion. Is n float64?
    f, ok := n.(float64)
    // If yes,
    if ok {
        // print the result
        fmt.Printf("%f is float64\n", f)
        // and return nil error.
        return nil
    }
    // Else return our custom error
    return errors.New(fmt.Sprintf("could not assert that \"%v\" is float64.\n", n))
}

func main() {
    // Successful
    // 1024.0 is float64
    err := assertFloat64(1024.0)
    if err != nil {
        fmt.Println(err)
    }

    // Failure
    // "foo" isn't float64
    err = assertFloat64("foo")
    if err != nil {
        fmt.Println(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

将打印:

1024.000000是float64
无法断言"foo"是float64.

操场

  • @shan`error`是[实现`Error()字符串`的接口]](http://golang.org/ref/spec#Errors)。调用此方法以检索消息。另外,`fmt`包可以处理`error`值并自动打印消息,因此您可以简单地使用`fmt.Println(err)`打印消息。 (2认同)

Inf*_*ake 17

添加到@intermernet的答案,如果您使用创建自定义错误消息errors.New(),您可能需要检查创建的特定错误消息。此外,任何其他类型的错误消息也可以以相同的方式检查。只需使用该fmt.Sprintf()函数即可strings.Contains()

你可以非常简单地做到这一点:

if fmt.Sprint(err) == "My Custom Error" {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

或者更好的使用strings.Contains()

if strings.Contains(fmt.Sprint(err), "Custom Error") {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

注意:您还可以使用err.Error()返回错误的字符串表示形式来代替fmt.Sprint(err).


met*_*ule 11

我想这会做你想要的:

func (t Trans) TicketQty() (intQty int, err error) {
  defer func() {    
    ex := recover()
    if(ex != nil){     
      // "%v" prints the value of ex
      // for strings, it is the string, for errors .Error() method, for Stringer the .String() etc
      // Errorf returns an error instead of a string
      err = fmt.Errorf("%v", ex)
    }
  }()   
  ... // do your thing
  return
}
Run Code Online (Sandbox Code Playgroud)