2013-07-09 2 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

예, 이미 랩핑 기능 옵션을 고려했습니다. 더 나은 대안이 없다면 그것을 사용할 것입니다. –

관련 문제