1. 程式人生 > >2.12 異常處理1:恐慌與處理

2.12 異常處理1:恐慌與處理

恐慌概述

  • 程式碼在執行時如果出現異常,系統會報出恐慌(panic)並終止執行
  • IDE和終端列印的恐慌日誌,包含了恐慌的資訊以及報恐慌所在的程式碼行
  • 恐慌好比一種震撼的暴力教育,其目的在於警示開發者,什麼是可以的而什麼又是不可以的
  • 程式碼在交付使用前要經過充分測試,處理一切可能的恐慌

系統報恐慌 本例中由於我們錯誤地使用了一個超出陣列長度的下標,導致系統報出恐慌

func demo21() {
    a := [5]int{0, 1, 2, 3, 4}

    a[1] = 123
    index := 2 + 8

    //系統報恐慌:執行時錯誤(exe在執行的過程中發生的錯誤),下標越界
//panic: runtime error: index out of range a[index] = 123 }

自己報恐慌

  • 除了系統報出恐慌以外,我們還可以通過內建函式panic自己報出恐慌
  • 自己報恐慌的目的,是預測程式在執行時可能出現的異常情形,並提示當前程式碼的呼叫者以錯誤資訊
  • 下面的例子中,計算圓面積這一函式在呼叫時如果傳入了一個負數的半徑,則會報出恐慌,提示半徑是不可以為負數的,這樣做相當於強制程式碼的呼叫者傳入非負的半徑
func getCircleArea(radius float32) (area float32) {
    //如果半徑引數為負數,則丟擲異常
if radius < 0{ panic("顫抖吧,您的智商已下線,半徑不能為負數") } return 3.14 * radius * radius } func demo22() { //程式會因為丟擲的異常未經處理而崩潰 getCircleArea(-5) }

處理恐慌

  • 程式在上線前必須測試和掃滅所有可能的恐慌
  • 在沒有對恐慌進行任何處理前,程式會在報恐慌的行崩潰
  • Go語言提供了recover內建函式,讓崩潰的程式復活並返回造成程式崩潰的error例項
  • 所以我們可以在正式的業務邏輯開始前,事先掛起一個延時處理恐慌的函式,在其中藉助recover函式獲得造成程式崩潰的error並處理
  • 當程式在123行崩潰時,123行以後的程式碼就不會再執行了,而是直接跳轉到defer了的恐慌處理程式
func demo23() {

    //延時執行恐慌處理程式
    //延時到什麼時候?①函式正常結束前②恐慌發生時(函式內恐慌以後的程式碼將不會執行)
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()

    //下面的函式會恐慌(報恐慌)
    getCircleArea(-5)

    //所以這裡執行不到,而是直接跳到defer所定義的恐慌處理程式
    print("這裡有美女相贈")
}
  • 下面這段程式碼對前面的demo23進行了呼叫
  • 由於demo23()是一個已經定義了恐慌處理方式的函式,程式不會因為demo23中的恐慌而崩潰
func demo24() {
    //本來該應該因恐慌而死,但已經在其中插入了異常(恐慌)處理程式,就不會造成程式崩潰
    //丟失的部分僅僅為demo23中恐慌以後的部分
    demo23()

    fmt.Println("搶錢搶糧搶地盤")
    fmt.Println("GAME OVER")
}