回到简体

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,10 +1,10 @@
## 5.9. Panic
## 5.9. Panic
Go的類型繫統會在編譯時捕獲很多錯誤,但有些錯誤隻能在運行時檢査,如數組訪問越界、空指引用等。這些運行時錯誤會引起painc常。
Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指引用等。这些运行时错误会引起painc常。
一般而言,panic異常發生時,程序會中斷運行,併立卽執行在goroutine可以先理解成在第8章會詳細介紹)中被延的函defer 機製)。隨後,程序崩潰併輸出日信息。日信息包括panic value和函數調用的堆棧跟蹤信息。panic value通常是某種錯誤信息。對於每個goroutine信息中都會有與之相的,生panic的函數調用堆棧跟蹤信息。通常,我不需要再次行程序去定位問題,日信息已提供了足夠的診斷依據。因此,在我們填寫問題報告時,一般會將panic常和日信息一併記録
一般而言,panic异常发生时,程序会中断运行,并立即执行在goroutine可以先理解成线在第8章会详细介绍)中被延的函defer 机制)。随后,程序崩溃并输出日信息。日信息包括panic value和函数调用的堆栈跟踪信息。panic value通常是某种错误信息。对于每个goroutine信息中都会有与之相的,生panic的函数调用堆栈跟踪信息。通常,我不需要再次行程序去定位问题,日信息已提供了足够的诊断依据。因此,在我们填写问题报告时,一般会将panic常和日信息一并记录
不是所有的panic常都來自運行時,直接調用內置的panic函數也會引發panicpanic函接受任何值作爲參數。當某些不應該發生的場景發生時,我們就應該調用panic。比如程序到了某條邏輯上不可能到的路
不是所有的panic常都来自运行时,直接调用内置的panic函数也会引发panicpanic函接受任何值作为参数。当某些不应该发生的场景发生时,我们就应该调用panic。比如程序到了某条逻辑上不可能到的路
```Go
switch s := suit(drawCard()); s {
@@ -17,7 +17,7 @@ switch s := suit(drawCard()); s {
}
```
言函數必須滿足的前置件是明智的做法,但很容易被用。除非你能提供更多的錯誤信息,或者能更快速的發現錯誤,否不需要使用言,編譯器在運行時會幫你檢査代碼
言函数必须满足的前置件是明智的做法,但很容易被用。除非你能提供更多的错误信息,或者能更快速的发现错误,否不需要使用言,编译器在运行时会帮你检查代码
```Go
func Reset(x *Buffer) {
@@ -28,11 +28,11 @@ func Reset(x *Buffer) {
}
```
然Go的panic機製類似於其他言的但panic的適用場景有一些不同。由panic引起程序的崩因此panic一般用於嚴重錯誤,如程序部的邏輯不一致。勤的程序員認爲任何崩都表明代中存在漏洞,所以對於大部分漏洞,我們應該使用Go提供的錯誤機製而不是panic量避免程序的崩。在健的程序中,任何可以料到的錯誤,如不正確的輸入、錯誤的配置或是失的I/O操作都應該被優雅的理,最好的理方式就是使用Go的錯誤機製
然Go的panic机制类似于其他言的但panic的适用场景有一些不同。由panic引起程序的崩因此panic一般用于严重错误,如程序部的逻辑不一致。勤的程序员认为任何崩都表明代中存在漏洞,所以对于大部分漏洞,我们应该使用Go提供的错误机制而不是panic量避免程序的崩。在健的程序中,任何可以料到的错误,如不正确的输入、错误的配置或是失的I/O操作都应该被优雅的理,最好的理方式就是使用Go的错误机制
regexp.Compile函數,該函數將正則表達式編譯成有效的可匹配格式。當輸入的正則表達式不合法時,該函數會返迴一個錯誤。當調用者明的知道正確的輸入不引起函數錯誤時,要求調用者檢査這個錯誤是不必要和纍贅的。我們應該假設函數的輸入一直合法,就如前面的言一樣:當調用者入了不應該出現的輸入時,觸發panic常。
regexp.Compile函数,该函数将正则表达式编译成有效的可匹配格式。当输入的正则表达式不合法时,该函数会返回一个错误。当调用者明的知道正确的输入不引起函数错误时,要求用者检查这个错误是不必要和累赘的。我们应该假设函数的输入一直合法,就如前面的言一样:当调用者入了不应该出现的输入时,触发panic常。
在程序源中,大多數正則表達式是字符串字面值string literals因此regexp包提供了包裝函數regexp.MustCompile檢査輸入的合法性。
在程序源中,大多数正则表达式是字符串字面值string literals因此regexp包提供了包装函数regexp.MustCompile检查输入的合法性。
```Go
package regexp
@@ -46,13 +46,13 @@ func MustCompile(expr string) *Regexp {
}
```
裝函數使得調用者可以便捷的用一個編譯後的正則表達式爲包級别的變量賦值:
装函数使得用者可以便捷的用一个编译后的正则表达式为包级别的变量赋值:
```Go
var httpSchemeRE = regexp.MustCompile(`^https?:`) //"http:" or "https:"
```
MustCompile不能接收不合法的入。函名中的Must前是一種針對此類函數的命名比如template.Must4.6
MustCompile不能接收不合法的入。函名中的Must前是一种针对此类函数的命名比如template.Must4.6
```Go
func main() {
@@ -65,7 +65,7 @@ func f(x int) {
}
```
上例中的運行輸出如下:
上例中的运行输出如下:
```
f(3)
@@ -76,7 +76,7 @@ defer 2
defer 3
```
f(0)被調用時,發生panic常,之前被延遲執行的的3fmt.Printf被調用。程序中斷執行後panic信息和堆信息會被輸出(下面是化的出):
f(0)被调用时,发生panic常,之前被延迟执行的的3fmt.Printf被用。程序中断执行后panic信息和堆信息会被输出(下面是化的出):
```
panic: runtime error: integer divide by zero
@@ -92,9 +92,9 @@ main.main()
src/gopl.io/ch5/defer1/defer.go:10
```
在下一節將看到,如何使程序panic常中恢,阻止程序的崩
在下一节将看到,如何使程序panic常中恢,阻止程序的崩
了方便診斷問題runtime包允程序員輸出堆信息。在下面的例子中,我們通過在main函中延遲調用printStack出堆信息。
了方便诊断问题runtime包允程序员输出堆信息。在下面的例子中,我们通过在main函中延迟调用printStack出堆信息。
```Go
gopl.io/ch5/defer2
@@ -109,7 +109,7 @@ func printStack() {
}
```
printStack的簡化輸出如下(下面是printStack的不包括panic的日信息):
printStack的简化输出如下(下面是printStack的不包括panic的日信息):
```
goroutine 1 [running]:
@@ -127,4 +127,4 @@ main.main()
src/gopl.io/ch5/defer2/defer.go:15
```
panic機製類比其他語言異常機製的讀者可能會驚訝runtime.Stack何能出已經被釋放函的信息在Go的panic機製中,延遲函數的調用在放堆信息之前。
panic机制类比其他语言异常机制的读者可能会惊讶runtime.Stack何能出已经被释放函的信息在Go的panic机制中,延迟函数的调用在放堆信息之前。