2014-09-03 5 views
5

나는 공황 상태에서 어떻게 회복하는지 이해하려고 노력하고 있습니다. 일반적으로 이와 같은 작업은 다음과 같이 처리됩니다.골란 반환 값 구문

if r := recover(); r != nil { 
    fmt.Println("Recovered in f", r) 
} 

나는 그 점을 많이 알 수 있습니다. 그러나 folowing과 같은 코드 스 니펫을 보았습니다.

if r, ok := recover().(error); ok { 
    fmt.Println("Recovered in f", r) 
} 

. (오류) 부분은 무엇을하고 있습니까?

답변

11

error recovered이 특정 유형인지 확인하는 것은 type assertion입니다.

해당 유형의 어설 션이 실패하여 런타임에 오류가 발생하여 아무 것도 인터럽트하지 않은 것처럼 계속 진행됩니다.

로컬 MyError 유형을 오류로 정의하고 해당 유형에서만 복구하려고 할 때 유용합니다.

당신은 유형의 주장으로 net.Error을 테스트하고 영구적 인 것과 일시적인 네트워크 오류를 구별 할 수있다 "Error handling and Go"

클라이언트 코드의 예를 볼 수 있습니다. 예를 들어

, 웹 크롤러 수도 :

  • 수면과가 임시 오류를
  • 가 발생하고, 그렇지 않으면 포기하면 다시 시도하십시오.
if nerr, ok := err.(net.Error); ok && nerr.Temporary() { 
    time.Sleep(1e9) 
    continue 
} 
if err != nil { 
    log.Fatal(err) 
} 

당신은 복구 할 오류의 여러 유형이있는 경우, 당신은 유형 스위치를 사용할 수는 "Golang: returning from defer"

defer func() { 
    if r := recover(); r != nil { 
     fmt.Println("Recovered in f", r) 
     // find out exactly what the error was and set err 
     switch x := r.(type) { 
     case string: 
      err = errors.New(x) 
     case error: 
      err = x 
     default: 
      err = errors.New("Unknown panic") 
     } 
     // invalidate rep 
     rep = nil 
     // return the modified err and rep 
    } 
}()