回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,15 +1,15 @@
## 5.4. 錯誤
## 5.4. 错误
在Go中有一部分函數總是能成功的行。比如strings.Contains和strconv.FormatBool函數,對各種可能的入都做了良好的理,使得運行時幾乎不會失敗,除非遇到災難性的、不可料的情,比如運行時的內存溢出。導致這種錯誤的原因很複雜,難以處理,從錯誤中恢的可能性也很低。
在Go中有一部分函数总是能成功的行。比如strings.Contains和strconv.FormatBool函数,对各种可能的入都做了良好的理,使得运行时几乎不会失败,除非遇到灾难性的、不可料的情,比如运行时的内存溢出。导致这种错误的原因很复杂,难以处理,从错误中恢的可能性也很低。
有一部分函數隻要輸入的參數滿足一定件,也能保證運行成功。比如time.Date函數,該函數將年月日等參數構造成time.Time象,除非最後一個參數時區是nil。這種情況下會引發panic常。panic是自被調函數的信,表示生了某已知的bug。一良好的程序永遠不應該發生panic常。
有一部分函数只要输入的参数满足一定件,也能保证运行成功。比如time.Date函数,该函数将年月日等参数构造成time.Time象,除非最后一个参数时区是nil。这种情况下会引发panic常。panic是自被调函数的信,表示生了某已知的bug。一良好的程序永远不应该发生panic常。
對於大部分函而言,永遠無法確保能否成功行。是因爲錯誤的原因超出了程序的控製。舉個例子,任何行I/O操作的函數都會面臨出現錯誤的可能,隻有沒有經驗的程序員才會相信讀寫操作不會失敗,卽時是簡單的讀寫。因此,當本該可信的操作出乎意料的失敗後,我們必須弄清楚致失的原因。
对于大部分函而言,永远无法确保能否成功行。是因为错误的原因超出了程序的控制。举个例子,任何行I/O操作的函数都会面临出现错误的可能,只有没有经验的程序员才会相信读写操作不会失败,即时是简单的读写。因此,当本该可信的操作出乎意料的失败后,我们必须弄清楚致失的原因。
在Go的錯誤處理中,錯誤是軟件包API和用程序用界面的一重要成部分,程序行失敗僅被認爲是幾個預期的果之一。
在Go的错误处理中,错误是软件包API和用程序用界面的一重要成部分,程序行失败仅被认为是几个预期的果之一。
對於那些將運行失看作是預期結果的函,它們會返迴一個額外的返值,通常是最後一個,來傳遞錯誤信息。如果致失的原因有一個,額外的返值可以是一個布爾值,通常被命名ok。比如cache.Lookup失的唯一原因是key不存在麽代碼可以按照下面的方式組織
对于那些将运行失看作是预期结果的函,它们会返回一个额外的返值,通常是最后一个,来传递错误信息。如果致失的原因有一个,额外的返值可以是一个布尔值,通常被命名ok。比如cache.Lookup失的唯一原因是key不存在么代码可以按照下面的方式组织
```Go
value, ok := cache.Lookup(key)
@@ -18,22 +18,22 @@ if !ok {
}
```
通常,致失的原因不止一,尤其是I/O操作而言需要了解更多的錯誤信息。因此,外的返值不再是簡單的布爾類而是error型。
通常,致失的原因不止一,尤其是I/O操作而言需要了解更多的错误信息。因此,外的返值不再是简单的布尔类而是error型。
置的error是接口型。我們將在第七章了解接口型的含,以及它對錯誤處理的影響。現在我們隻需要明白error型可能是nil或者non-nil。nil意味着函數運行成功non-nil表示失敗。對於non-nil的error型,我可以通過調用error的Error函或者出函數獲得字符串型的錯誤信息。
置的error是接口型。我们将在第七章了解接口型的含,以及它对错误处理的影响。现在我们只需要明白error型可能是nil或者non-nil。nil意味着函数运行成功non-nil表示失败。对于non-nil的error型,我可以通过调用error的Error函或者出函数获得字符串型的错误信息。
```Go
fmt.Println(err)
fmt.Printf("%v", err)
```
通常,當函數返迴non-nil的error,其他的返值是未定的(undefined),些未定的返迴值應該被忽略。然而,有少部分函數在發生錯誤時,仍然會返迴一些有用的返值。比如,當讀取文件發生錯誤時Read函數會返迴可以取的字節數以及錯誤信息。對於這種情況,正確的處理方式應該是先處理這些不完整的數據,再處理錯誤。因此對函數的返值要有清晰的明,以便其他人使用。
通常,当函数返回non-nil的error,其他的返值是未定的(undefined),些未定的返回值应该被忽略。然而,有少部分函数在发生错误时,仍然会返回一些有用的返值。比如,当读取文件发生错误时Read函数会返回可以取的字节数以及错误信息。对于这种情况,正确的处理方式应该是先处理这些不完整的数据,再处理错误。因此对函数的返值要有清晰的明,以便其他人使用。
在Go中數運行失敗時會返迴錯誤信息,這些錯誤信息被認爲是一種預期的值而非exception使得Go有别那些將函數運行失看作是常的言。然Go有各種異常機製,但這些機製僅被使用在理那些未被料到的錯誤,卽bug而不是那些在健程序中應該被避免的程序錯誤。對於Go的異常機製我們將在5.9介
在Go中数运行失败时会返回错误信息,这些错误信息被认为是一种预期的值而非exception使得Go有别那些将函数运行失看作是常的言。然Go有各种异常机制,但这些机制仅被使用在理那些未被料到的错误,即bug而不是那些在健程序中应该被避免的程序错误。对于Go的异常机制我们将在5.9介
Go這樣設計的原因是由於對於某個應該在控流程中理的錯誤而言,將這個錯誤以異常的形式拋出會混亂對錯誤的描述,通常會導致一些糟糕的果。當某個程序錯誤被當作異常處理後,這個錯誤會將堆棧根據信息返迴給終端用戶,這些信息複雜且無用,無法幫助定位錯誤
Go这样设计的原因是由于对于某个应该在控流程中理的错误而言,将这个错误以异常的形式抛出会混乱对错误的描述,通常会导致一些糟糕的果。当某个程序错误被当作异常处理后,这个错误会将堆栈根据信息返回给终端用户,这些信息复杂且无用,无法帮助定位错误
正因此Go使用控製流機製如if和return處理異常,使得編碼人員能更多的關註錯誤處理。
正因此Go使用控制流机制如if和return处理异常,使得编码人员能更多的关注错误处理。
{% include "./ch5-04-1.md" %}