一、defer
package main
import (
"fmt"
"os"
"bufio"
)func trydefer() }}
func writefile(filename string) else
return
} defer file.close()//無論return、panic最後都會被執行
writer := bufio.newwriter(file)
defer writer.flush()//先進後執行,後進先執行,退出時先執行flush,再執行close
f := fibonacci()
for i := 0; i < 20; i++
}func main()
輸出:
3029
2827
2625
2423
2221
2019
1817
1615
1413
1211109
8765
4321
0panic: printed too many
goroutine 1 [running]:
main.trydefer()
/users/jltxgcy/go/src/learn/errhandling/defer/defer.go:24 +0x111
main.main()
/users/jltxgcy/go/src/learn/errhandling/defer/defer.go:56 +0x20
defer執行的順序是先進後執行,無論是提前return還是panic,defer都會執行,用於關閉資源等,通常是成對出現。
二、recovery
package main
import (
"fmt"
)func tryrecover()
if err, ok := r.(error); ok else
}()// uncomment each block to see different panic
// scenarios.
// normal error
panic(errors.new("this is an error"))
// division by zero
//b := 0
//a := 5 / b
// causes re-panic
//panic(123)
}func main()
輸出:
error occurred: this is an error
開啟:
b := 0
a := 5 / b
fmt.println(a)
輸出:
error occurred: runtime error: integer divide by zero
開啟:
panic(123)
輸出:
panic: 123 [recovered]
panic: i don't know what to do: 123
goroutine 1 [running]:
main.tryrecover.func1()
/users/jltxgcy/go/src/learn/errhandling/recover/recover.go:19 +0x1f6
panic(0x10ac4a0, 0x10eb4d0)
/usr/local/go/src/runtime/panic.go:679 +0x1b2
main.tryrecover()
/users/jltxgcy/go/src/learn/errhandling/recover/recover.go:35 +0x5f
main.main()
/users/jltxgcy/go/src/learn/errhandling/recover/recover.go:39 +0x20
總結:recover是用來接收panic的錯誤的,類似於try catch,用於捕捉panic的資訊,不至於讓panic輸出資訊那麼難看。
如上panic(123),123並不是error型別,所以列印panic: i don't know what to do: 123。
三、錯誤處理例項
1、目錄結構
filelistingserver(目錄)
filelisting(目錄)
type usererror string//string也能實現介面
file, err := os.open(path)//本地開啟檔案,可能不存在,可能沒有許可權,都向上返回,讓上一層來處理
}啟動server,在瀏覽器輸入localserver:8888/list/abc.txt,就可以顯示本地目錄下的abc.txt。
golang 錯誤處理
go 程式使用 error 值來表示錯誤狀態。與 fmt.stringer 類似,error 型別是乙個內建介面 type error inte ce 與 fmt.stringer 類似,fmt 包在列印值時也會滿足 error。通常函式會返回乙個 error 值,呼叫的它的 應當判斷這個錯誤是否等...
Golang的錯誤處理
1 當錯誤 panic 發生後,程式就會退出 崩潰 2 希望發生錯誤後,能夠捕獲到錯誤,並對其進行處理,保證後續程式能夠繼續執行 go中引入的處理方式是 defer panic recover。其中go中可以丟擲乙個panic異常,然後在defer中通過recover捕獲這個異常,然後正常處理。1 ...
Golang 20 錯誤處理
go 語言通過內建的錯誤介面提供了非常簡單的錯誤處理機制。error型別是乙個介面型別,這是它的定義 type error inte ce我們可以在編碼中通過實現 error 介面型別來生成錯誤資訊。函式通常在最後的返回值中返回錯誤資訊。使用errors.new 可返回乙個錯誤資訊 package ...