在開發過程當中,常常會使用到文件或數據庫,為了在函數執行完及時釋放資源,golang 提供 defer
會將 func 語句完全跑完,當執行完在執行 defer 的語句,defer 為後進先出的概念
故接近底部的 defer 語句,會越先執行
package main
import (
"fmt"
)
func main() {
sum(10, 20)
}
func sum(a, b int) int {
result := 0
defer fmt.Printf("a:%d\n", a)
defer fmt.Printf("b:%d\n", b)
defer fmt.Printf("a + b before result:%d\n", result)
result = a + b
defer fmt.Printf("a + b after result:%d\n", result)
return result
}
發生錯誤(panic)就會崩潰退出,比較偏向非預期錯誤(算是最嚴重的錯誤)
在撰寫程式碼過程當中,我們會希望在發生異常時,不要導致整個程式碼崩潰
故後續會討論到如何處理非預期異常並將這些異常緊急處理,成為可預期的 error
在 golang 不支持 try...catch...finally
package main
import (
"fmt"
)
func main() {
sum()
}
func sum() int {
sum := 0
for i := 0; i <= 10; i++ {
sum += i
if i == 5 {
panic("發生恐慌")
}
}
fmt.Println(sum)
return sum
}
捕獲 panic 錯誤,讓程式碼可以繼續執行下去
package main
import (
"fmt"
)
func main() {
fmt.Println(sum())
}
func sum() int {
defer func() {
error := recover()
fmt.Printf("捕獲異常 error 為 %s\n", error)
}()
sum := 0
for i := 0; i <= 10; i++ {
sum += i
if i == 5 {
panic("發生恐慌")
}
}
fmt.Println(sum)
return sum
}