duangutian1426 2014-03-04 11:40
浏览 669
已采纳

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

I referred this question - os.Error - string value (Golang), but that is not working in my case.

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 
}

In that err I need the error message that is thrown, e.g. if the parsing logic fails, it is throwing an error automatically. That is the error I need to catch. I am showing this only for example - whatever the runtime exception is, I need to catch it and pass as err in the return.

How to achieve that?

  • 写回答

2条回答 默认 最新

  • douzhendi4559 2014-03-04 12:08
    关注

    Use the errors package to create new errors.

    err = errors.New("an error")
    

    The returned error can be treated as a string by either accessing err.Error(), or using the fmt package functions (for example fmt.Println(err)).

    Don't use recover unless you really know what you're doing. It's idiomatic to return all errors, and to deal with them when they arise.

    See Error handling and Go, and Defer, Panic and Recover on the Go blog for more info.

    EDIT:

    Re-reading your question, it looks like you're trying to recover from possible failed type assertions. In this instance it's recommended to use the "comma, ok" idiom (mentioned in the previously linked section of the docs), which (slightly paraphrased to be more general) means:

    "If the type assertion fails, [the receiver variable] will still exist and be of type [whatever was asserted], but it will have the zero value..."

    Simple example to test if an interface{} is actually a float64 through type assertion, and produce a custom error if it fails (instead of panicking):

    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
    ", 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))
    }
    
    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)
        }
    }
    

    Will print:

    1024.000000 is float64
    could not assert that "foo" is float64.

    Playground

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试