回到简体

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,6 +1,6 @@
## 7.11. 基於類型斷言區别錯誤類
## 7.11. 基于类型断言区别错误类
思考在os包中文件操作返迴的錯誤集合。I/O可以因任何量的原因失,但是有三種經常的錯誤必須進行不同的理:文件已存在(對於創建操作),找不到文件(對於讀取操作),和限拒。os包中提供了這三個幫助函數來對給定的錯誤值表示的失敗進行分
思考在os包中文件操作返回的错误集合。I/O可以因任何量的原因失,但是有三种经常的错误必须进行不同的理:文件已存在(对于创建操作),找不到文件(对于读取操作),和限拒。os包中提供了这三个帮助函数来对给定的错误值表示的失败进行分
```go
package os
@@ -10,7 +10,7 @@ func IsNotExist(err error) bool
func IsPermission(err error) bool
```
對這些判的一缺乏經驗的實現可能會去檢査錯誤消息是否包含了特定的子字符串,
对这些判的一缺乏经验的实现可能会去检查错误消息是否包含了特定的子字符串,
```go
func IsNotExist(err error) bool {
@@ -19,9 +19,9 @@ func IsNotExist(err error) bool {
}
```
但是理I/O錯誤的邏輯可能一和另一平台非常的不同,所以這種方案不健壯併且對相同的失可能會報出各不同的錯誤消息。在測試的過程中,通過檢査錯誤消息的子字符串來保證特定的函以期望的方式失是非常有用的,但對於線上的代是不的。
但是理I/O错误的逻辑可能一和另一平台非常的不同,所以这种方案不健壮并且对相同的失可能会报出各不同的错误消息。在测试的过程中,通过检查错误消息的子字符串来保证特定的函以期望的方式失是非常有用的,但对于线上的代是不的。
更可靠的方式是使用一個專門的類型來描述結構化的錯誤。os包中定了一PathError類型來描述在文件路操作中涉及到的失像Open或者Delete操作,且定了一叫LinkError的變體來描述涉及到兩個文件路的操作像Symlink和Rename。下面是os.PathError
更可靠的方式是使用一个专门的类型来描述结构化的错误。os包中定了一PathError类型来描述在文件路操作中涉及到的失像Open或者Delete操作,且定了一叫LinkError的变体来描述涉及到两个文件路的操作像Symlink和Rename。下面是os.PathError
```go
package os
@@ -38,7 +38,7 @@ func (e *PathError) Error() string {
}
```
大多數調用方都不知道PathError且通過調用錯誤本身的Error方法來統一處理所有的錯誤。盡管PathError的Error方法簡單地把些字段接起生成錯誤消息PathError的結構保護了內部的錯誤組件。調用方需要使用類型斷言來檢測錯誤的具體類型以便將一種失敗和另一種區分開;具體的類型比字符串可以提供更多的細節
大多数调用方都不知道PathError且通过调用错误本身的Error方法来统一处理所有的错误。尽管PathError的Error方法简单地把些字段接起生成错误消息PathError的结构保护了内部的错误组件。用方需要使用类型断言来检测错误的具体类型以便将一种失败和另一种区分开;具体的类型比字符串可以提供更多的细节
```go
_, err := os.Open("/no/such/file")
@@ -48,7 +48,7 @@ fmt.Printf("%#v\n", err)
// &os.PathError{Op:"open", Path:"/no/such/file", Err:0x2}
```
就是三個幫助函是怎工作的。例如下面展示的IsNotExist會報出是否一個錯誤和syscall.ENOENT(§7.8)或者和有名的錯誤os.ErrNotExist相等(可以在§5.4.2中找到io.EOF或者是一*PathError部的錯誤是syscall.ENOENT和os.ErrNotExist其中之一。
就是三个帮助函是怎工作的。例如下面展示的IsNotExist会报出是否一个错误和syscall.ENOENT(§7.8)或者和有名的错误os.ErrNotExist相等(可以在§5.4.2中找到io.EOF或者是一*PathError部的错误是syscall.ENOENT和os.ErrNotExist其中之一。
```go
import (
@@ -69,11 +69,11 @@ func IsNotExist(err error) bool {
}
```
下面里是它的實際使用:
下面里是它的实际使用:
```go
_, err := os.Open("/no/such/file")
fmt.Println(os.IsNotExist(err)) // "true"
```
如果錯誤消息合成一更大的字符串,然PathError的結構就不再人所知,例如通過一個對fmt.Errorf函數的調用。區别錯誤通常必在失操作後,錯誤傳迴調用者前行。
如果错误消息合成一更大的字符串,然PathError的结构就不再人所知,例如通过一个对fmt.Errorf函数的调用。区别错误通常必在失操作后,错误传回调用者前行。