2013-03-17 181 views
2

我一直在閱讀this blog post,但我仍然不確定我確切地知道如何處理自定義錯誤,以便從我的函數返回並在其外部處理。Go中的自定義錯誤處理

這是目前我在做什麼:

func doSomething() int { 
    x := 0 
    // Do something with x. 
    ... 
    if somethingBadHappened { 
     return -1 
    } 
    if somethingElseBadHappened { 
     return -2 
    } 
    return x 
} 

這是想什麼,我在做:

func doSomething() int, ? { 
    ... 
    if somethingBadHappened { 
     return ?, err 
    } 
    if somethingElseBadHappened { 
     return ?, err2 
    } 
    return x, nil 
} 

但我不完全知道如何和什麼用這些問號替換這些問號。

回答

3

我會變成

func doSomething() int, ? { 
     ... 
     if somethingBadHappened { 
       return ?, err 
     } 

     if somethingElseBadHappened { 
       return ?, err2 
     } 

     return x, nil 
} 

func doSomething() (r int, err error) { 

     ... 

     if somethingBadHappened { 
       err = err1 // Whatever satisfies the `error` interface 
       return 
     } 

     if somethingElseBadHappened { 
       err = err2 // dtto 
       return 
     } 

     return x, nil 
} 

督察,在調用點它是慣用*忽略,從不使用或依賴任何其他返回值,如果err!= nil,那麼只是不在乎如果上面的已經被分配了一些中間值或沒有。

(*)第一個近似值,即,如果沒有另行說明。例如。一個io.Reader明確聲明它可以在同一時間同時返回err == io.EOF和有效的數據:

在讀的時候遇到成功讀取N> 0字節後錯誤或檔案結尾狀態,將返回的數量字節讀取。它可能會從相同的調用中返回(非零)錯誤,或者從後續調用中返回錯誤(和n == 0)。這種一般情況的一個實例是,在輸入流末尾返回非零字節數的Reader可能會返回err == EOF或err == nil。無論如何,下一次Read應返回0,EOF。

+0

嗯。爲了滿足錯誤接口,我只需要創建一個帶有字符串變量的新結構類型並創建一個Error實現,對吧?或者有更簡單的方法嗎? – 2013-03-17 15:52:37

+0

@jnml - 不應該'return x,nil'是'return r,nil'? – 2013-03-17 18:15:34

+0

@ Ekkehard.Horner:它也可能是'return r,nil',但並不是必然的。在OP中,「x」代表一個局部變量,它在這裏的意思也是如此。一般來說,最後一行可以是'return'或'reuturn expr1,expr2'。 – zzzz 2013-03-17 18:30:25

7

如果你不想要,你並不需要返回一個int。你可以這樣做:

func doSomething() error { 
    ... 
    if somethingBadHappened { 
     return errors.New("something bad happened") 
    } 
    if somethingElseBadHappened { 
     return errors.New("something else bad happened") 
    } 
    return nil 
} 

,或者如果你想返回整數

func doSomething() (int, error) { 
    ... 
    if somethingBadHappened { 
     return -1, errors.New("something bad happened") 
    } 
    if somethingElseBadHappened { 
     return -2, errors.New("something else bad happened") 
    } 
    return x, nil 
} 

一定要import "errors"頂部。

如果你想測試你是否得到一個錯誤,你可以做

x, err := doSomething() 
if err != nil { 
    log.Println(err) 
}