[解決済み] golangでエラーメッセージを文字列で取得するには?
質問
この質問は 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であることを主張することができませんでした。
関連
-
[解決済み] Goでマップにキーが含まれているかどうかを確認するには?
-
[解決済み] ゼロ終端のバイト配列を文字列に変換するにはどうすればよいですか?
-
[解決済み] サーバーでSSLが有効になっていない
-
[解決済み] GoLangで文字列を比較するにはどうしたらいいですか?
-
[解決済み] Goのintとint64の違いは何ですか?
-
[解決済み] チャネルバッファサイズとは何ですか?
-
[解決済み] Go で / に異なるメソッドの http リクエストを処理するにはどうすればよいですか?
-
[解決済み] スライスは値で渡されるのか?
-
[解決済み] env varが空の場合、どのようにデフォルト値を割り当てるのですか?
-
[解決済み] Goで複数のコマンドをパイプでつなぐには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] サーバーでSSLが有効になっていない
-
[解決済み] Goを使って大きなファイルを効率よくダウンロードするにはどうしたらいいですか?
-
[解決済み] Goプロジェクトの賢明なレイアウト方法とは [終了しました]。
-
[解決済み] Goのargv[0]に相当するものは何ですか?
-
[解決済み] go ウェブサーバーを使って静的な html ファイルを提供するにはどうすればよいですか?
-
[解決済み] Goチャンネルはどのように実装されるのですか?
-
[解決済み] Goで複数のコマンドをパイプでつなぐには?
-
[解決済み] Goで一度に複数の変数を宣言できますか?
-
[解決済み] ゴルーチン最大数
-
[解決済み] http.Handleとhttp.HandleFuncの違いとは?