1. ホーム
  2. go

[解決済み] golangでエラーメッセージを文字列で取得するには?

2023-09-04 13:05:35

質問

この質問は 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 
}

その中で err 投げられたエラーメッセージが必要です。例えば、パースロジックが失敗した場合、自動的にエラーが投げられます。これは私がキャッチする必要があるエラーです。実行時例外が何であれ、私はそれをキャッチし、次のように渡す必要があります。 err として返す必要があります。

どうすれば実現できるのか?

どのように解決するのですか?

この場合 errors パッケージを使用して、新しいエラーを作成します。

err = errors.New("an error")

返されたエラーは文字列として扱うことができます。 err.Error() にアクセスするか、あるいは fmt パッケージの関数(例えば fmt.Println(err) ).

を使用しないでください。 recover を使わないでください。 を使用しないでください。 . すべてのエラーを返し、エラーが発生したときに対処するのがイディオムです。

参照 エラー処理とGo を、そして 延期、パニック、リカバリー をご覧ください。

EDIT

質問を読み直すと、失敗した可能性のある タイプ アサーション . この場合、quot;comma, ok"イディオム(docsの以前のリンクセクションで言及)を使用することが推奨されています。

"型アサーションが失敗した場合、[レシーバー変数] はまだ存在し、[アサーションされたもの] の型ですが、ゼロ値を持ちます... "

単純な例として 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)
    }
}

印刷されます。

<ブロッククオート

1024.000000はfloat64です。

は "foo" がfloat64であることを主張することができませんでした。

プレイグラウンド