This commit is contained in:
chai2010
2016-01-18 11:14:19 +08:00
parent a91355f5f1
commit 884ada9cd0
20 changed files with 116 additions and 92 deletions

View File

@@ -4,7 +4,7 @@ Go的類型繫統會在編譯時捕獲很多錯誤但有些錯誤隻能在運
一般而言當panic異常發生時程序會中斷運行併立卽執行在該goroutine可以先理解成線程在第8章會詳細介紹中被延遲的函數defer 機製。隨後程序崩潰併輸出日誌信息。日誌信息包括panic value和函數調用的堆棧跟蹤信息。panic value通常是某種錯誤信息。對於每個goroutine日誌信息中都會有與之相對的發生panic時的函數調用堆棧跟蹤信息。通常我們不需要再次運行程序去定位問題日誌信息已經提供了足夠的診斷依據。因此在我們填寫問題報告時一般會將panic異常和日誌信息一併記録。
不是所有的panic異常都來自運行時直接調用內置的panic函數也會引發panic異常panic函數接受任何值作爲參數。 當某些不應該發生的場景發生時我們就應該調用panic。比如當程序到達了某條邏輯上不可能到達的路徑
不是所有的panic異常都來自運行時直接調用內置的panic函數也會引發panic異常panic函數接受任何值作爲參數。當某些不應該發生的場景發生時我們就應該調用panic。比如當程序到達了某條邏輯上不可能到達的路徑
```Go
switch s := suit(drawCard()); s {
@@ -67,7 +67,7 @@ func f(x int) {
上例中的運行輸出如下:
```bash
```
f(3)
f(2)
f(1)
@@ -78,7 +78,7 @@ defer 3
當f(0)被調用時發生panic異常之前被延遲執行的的3個fmt.Printf被調用。程序中斷執行後panic信息和堆棧信息會被輸出下面是簡化的輸出
```powershell
```
panic: runtime error: integer divide by zero
main.f(0)
src/gopl.io/ch5/defer1/defer.go:14
@@ -111,7 +111,7 @@ func printStack() {
printStack的簡化輸出如下下面隻是printStack的輸出不包括panic的日誌信息
```bash
```
goroutine 1 [running]:
main.printStack()
src/gopl.io/ch5/defer2/defer.go:20