在上一章,已經了解到了足夠多的error介面及其周邊的知識。現在,是學習另外一種異常處理方式的時候了。先來展示乙個名詞——panic。panic可被意譯為執行時恐慌。因為它只有在程式執行的時候才會被「丟擲來」。並且,恐慌是會被擴散的。當有執行時恐慌發生時,它會被迅速地向呼叫棧的上層傳遞。如果不顯式地處理它的話,程式的執行瞬間就會被終止。這裡有乙個專有名詞——程式崩潰。內建函式panic可以讓人為地產生乙個執行時恐慌。不過,這種致命錯誤是可以被恢復的。在go語言中,內建函式recover就可以做到這一點。
實際上,內建函式panic和recover是天生的一對。前者用於產生執行時恐慌,而後者用於「恢復」它。不過要注意,recover函式必須要在defer語句中呼叫才有效。因為一旦有執行時恐慌發生,當前函式以及在呼叫棧上的所有**都是失去對流程的控制權。只有defer語句攜帶的函式中的**才可能在執行時恐慌迅速向呼叫棧上層蔓延時「攔截到」它。這裡有乙個可以起到此作用的defer語句的示例:
defer func()
}()在這條defer語句中,呼叫了recover函式。該函式會返回乙個inte***ce{}型別的值。還記得嗎?inte***ce{}代表空介面。go語言中的任何型別都是它的實現型別。把這個值賦給了變數p。如果p不為nil,那麼就說明當前確有執行時恐慌發生。這時需根據情況做相應處理。注意,一旦defer語句中的recover函式呼叫被執行了,執行時恐慌就會被恢復,不論是否進行了後續處理。所以,一定不要只「攔截」不處理。
下面來反觀panic函式。該函式可接受乙個inte***ce{}型別的值作為其引數。也就是說,可以在呼叫panic函式的時候可以傳入任何型別的值。不過,建議大家在這裡只傳入error型別的值。這樣它表達的語義才是精確的。更重要的是,當呼叫recover函式來「恢復」由於呼叫panic函式而引發的執行時恐慌的時候,得到的值正是呼叫後者時傳給它的那個引數。因此,有這樣乙個約定是很有必要的。
總之,執行時恐慌代表程式執行過程中的致命錯誤。只應該在必要的時候引發它。人為引發執行時恐慌的方式是呼叫panic函式。recover函式是常會用到的。因為在通常情況下,肯定不想因為執行時恐慌的意外發生而使程式崩潰。最後,在「恢復」執行時恐慌的時候,大家一定要注意處理措施的得當。
package main
import (
"errors"
"fmt"
)func innerfunc()
func outerfunc()
defer func()
}()func main()
5 panic 異常處理
用於丟擲乙個執行時異常,會向上傳播,直到某個方法中使用了recover的內建函式接收了這個異常,程式才會恢復 需要配合defer函式使用,這樣才符合接收異常的語句。而且defer語句要寫在可能發生異常的 之前 以下例子會輸出這些內容 enter main enter outerfunc enter ...
struts 異常處理 全域性異常處理
記錄一下全域性異常處理的過程 處理主動丟擲的異常,轉向錯誤提示頁面。1 寫乙個自己的異常,繼承runtimeexception,從父類生成構造方法 package me.yndy.srtp.exception suppresswarnings serial public class errorexc...
python異常處理 Python 異常處理
使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...