mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-11-22 19:02:46 +00:00
fmt
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user