2013-07-09 14 views
5

関数が呼び出しスコープから返された行番号を取得することは可能ですか?関数が返される行番号を取得する

例:

func callee() error { 
    if cond { 
    return errors.New("whoops!") 
    } 
    return nil 
} 

func caller() { 
    // Possible to retrieve the line number of callee return here? 
    callee() 
} 

私はそれがすでにスタックから削除されなければならないので、それが、ことはできませんと仮定し、多分それはまだどこかにキャッシュされたのですか?

私はHTTPハンドラを持っているので、コードを捨てることなく、エラーが返された行とファイル名を記録したいと考えています。

答えて

7

AFAIK、AFAIKでは、最後に返却された行を自動的に取得することはできません。

しかし、小さなヘルパーと一つは持つことができます。

package main 

import (
     "fmt" 
     "runtime" 
) 

func here(s string, args ...interface{}) error { 
     _, fname, fline, _ := runtime.Caller(1) 
     h := fmt.Sprintf("%s:%d: ", fname, fline) 
     return fmt.Errorf(h+s, args...) 
} 

func foo(i int) error { 
     if i == 2 { 
       return here("cannot handle %d", i) // line 16 
     } 

     if i%3 == 0 { 
       return here("also cannot handle %d", i) // line 20 
     } 

     return nil 
} 

func main() { 
     fmt.Println(foo(2)) 
     fmt.Println(foo(3)) 
     fmt.Println(foo(4)) 
} 

Playground


出力:私はいくつかのようなコードを書いて投稿しようとしていました

/tmpfs/gosandbox-92c2a0f2_32bdf9d9_3c7d2a0a_80ba8510_f68d9721/prog.go:16: cannot handle 2 
/tmpfs/gosandbox-92c2a0f2_32bdf9d9_3c7d2a0a_80ba8510_f68d9721/prog.go:20: also cannot handle 3 
<nil> 
+1

+1それは答えとして、もはや必要がなくなったことを見るだけです。 –

+0

はい、私はすでにラッピング関数のオプションを考慮しました。より良い選択肢がないと思われる場合は、それを使用します。 –

関連する問題