在給定的 Go 程式碼片段中,在 sub( ) 功能。 sub() 內的延遲函數隨後再次出現恐慌,並具有不同的值。問題是,是否允許在 defer 函數內發生恐慌,特別是當程式已經發生恐慌時?
是的,在 defer 函數內發生恐慌是可以接受的,即使是在現有的恐慌。延遲功能引起的恐慌不會啟動獨特或異常的狀態;它只是延長了恐慌序列。
提供的程式碼範例示範了延遲函數引起的恐慌是無害的,甚至允許在更高層級使用recover()進行復原。
根據Go規範關於處理恐慌:
「如果同一個goroutine上的函數發生恐慌,則延遲函數將以與延遲相同的順序運行,最外面的延遲函數(最後調用的函數)首先運行,如果任何延遲函數調用recover並且在goroutine中的任何地方發生恐慌,則傳遞給recover的值將是該值。
雖然允許在defer 函數內發生恐慌,但請務必注意即:
以下範例說明了這一點行為:
<code class="go">func main() { defer func() { fmt.Println("Checkpoint 1"); panic(1) }() defer func() { fmt.Println("Checkpoint 2"); panic(2) }() panic(999) }</code>
輸出:
Checkpoint 2 Checkpoint 1 panic: 999 panic: 2 panic: 1
所有延遲函數都會執行,傳遞給所有panic()呼叫的值都包含在最終的panic序列中。
延遲函數內部的恐慌,即使是在現有的恐慌期間,在 Go 中也是可以接受的。然而,重要的是要了解延遲函數執行的順序和後果,並適當地使用recover()來處理恐慌。
以上是在 Go 中現有的恐慌期間,你可以在 Defer 函數內部發生恐慌嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!