<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## panic ~~~ 1、內置函數 2、假如函數F中書寫了panic語句,會終止其后要執行的代碼,在panic所在函數F內如果存在要執行的defer函數列表,按照defer的逆序執行 3、返回函數F的調用者G,在G中,調用函數F語句之后的代碼不會執行,假如函數G中存在要執行的defer函數列表,按照defer的逆序執行 4、直到goroutine整個退出,并報告錯誤 ~~~ ## recover ~~~ 1、內置函數 2、用來控制一個goroutine的panicking行為,捕獲panic,從而影響應用的行為 3、一般的調用建議 a). 在defer函數中,通過recever來終止一個goroutine的panicking過程,從而恢復正常代碼的執行 b). 可以獲取通過panic傳遞的error ~~~ 注意: ~~~ 1.利用recover處理panic指令,defer 必須放在 panic 之前定義,另外 recover 只有在 defer 調用的函數中才有效。否則當panic時,recover無法捕獲到panic,無法防止panic擴散。 2.recover 處理異常后,邏輯并不會恢復到 panic 那個點去,函數跑到 defer 之后的那個點。 3.多個 defer 會形成 defer 棧,后定義的 defer 語句會被最先調用。 ~~~ ## panic vs recover panic和recover與其他語言中的try-catch-finally語句類似,只不過一般我們很少使用panic和recover; 需要注意的是,你應該盡可能地使用錯誤,而不是使用 panic 和 recover。只有當程序不能繼續運行的時候,才應該使用 panic 和 recover 機制 * panic用于不可恢復的錯誤 * panic退出前會執行defer指定的內容 使用場景: 1. **發生了一個不能恢復的錯誤,此時程序不能繼續運行**。 一個例子就是 web 服務器無法綁定所要求的端口。在這種情況下,就應該使用 panic,因為如果不能綁定端口,啥也做不了。 2. **發生了一個編程上的錯誤**。 假如我們有一個接收指針參數的方法,而其他人使用`nil`作為參數調用了它。在這種情況下,我們可以使用 panic,因為這是一個編程錯誤:用`nil`參數調用了一個只能接收合法指針的方法 --- ***注意:當函數發生 panic 時,它會終止運行,在執行完所有的延遲函數后,程序控制返回到該函數的調用方。這樣的過程會一直持續下去,直到當前協程的所有函數都返回退出,然后程序會打印出 panic 信息,接著打印出堆棧跟蹤,最后程序終止*** ### 2.panic vs. os.Exit * os.Exit退出時不會調用defer指定的函數 * os.Exit退出時不輸出當前調用棧信息 ### 3.recover `recover`是一個內建函數,用于重新獲得 panic 協程的控制 `recover`函數的標簽如下所示: ~~~go func recover() interface{} ~~~ 只有在延遲函數的內部,調用`recover`才有用。在延遲函數內調用`recover`,可以取到`panic`的錯誤信息,并且停止 panic 續發事件(Panicking Sequence),程序運行恢復正常。如果在延遲函數的外部調用`recover`,就不能停止 panic 續發事件 ~~~ defer func() { if err := recover(); err != nil{ // 恢復錯誤 } }() ~~~ ### 4.panic vs. recover vs. Goroutine 只有在相同的Goroutine中調用 recover 才管用;`recover`不能恢復一個不同協程的 panic; 運行時錯誤(如數組越界)也會導致 panic。這等價于調用了內置函數`panic`,其參數由接口類型給出 `runtime.Error`接口的定義如下: ~~~go type Error interface { error // RuntimeError is a no-op function but // serves to distinguish types that are run time // errors from ordinary errors: a type is a // run time error if it has a RuntimeError method. RuntimeError() } ~~~ 當我們恢復panic時,我們就釋放了它的堆棧跟蹤,如果需要打印堆棧使用: ``` debug.PrintStack() ``` ### Go類try-catch語法 ~~~ func Try(fun func(), handler func(interface{})) { defer func() { if err := recover(); err != nil { handler(err) } }() fun() } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看