<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Lua 錯誤處理 程序運行中錯誤處理是必要的,在我們進行文件操作,數據轉移及web service 調用過程中都會出現不可預期的錯誤。如果不注重錯誤信息的處理,就會照成信息泄露,程序無法運行等情況。 任何程序語言中,都需要錯誤處理。錯誤類型有: * 語法錯誤 * 運行錯誤 ## 語法錯誤 語法錯誤通常是由于對程序的組件(如運算符、表達式)使用不當引起的。一個簡單的實例如下: ``` -- test.lua 文件 a == 2 ``` 以上代碼執行結果為: ``` lua: test.lua:2: syntax error near '==' ``` 正如你所看到的,以上出現了語法錯誤,一個 "=" 號跟兩個 "=" 號是有區別的。一個 "=" 是賦值表達式兩個 "=" 是比較運算。 另外一個實例: ``` for a= 1,10 print(a) end ``` 執行以上程序會出現如下錯誤: ``` lua: test2.lua:2: 'do' expected near 'print' ``` 語法錯誤比程序運行錯誤更簡單,運行錯誤無法定位具體錯誤,而語法錯誤我們可以很快的解決,如以上實例我們只要在for語句下添加 do 即可: ``` for a= 1,10 do print(a) end ``` ## 運行錯誤 運行錯誤是程序可以正常執行,但是會輸出報錯信息。如下實例由于參數輸入錯誤,程序執行時報錯: ``` function add(a,b) return a+b end add(10) ``` 當我們編譯運行以下代碼時,編譯是可以成功的,但在運行的時候會產生如下錯誤: ``` lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value) stack traceback: test2.lua:2: in function 'add' test2.lua:5: in main chunk [C]: ? ``` 以下報錯信息是由于程序缺少 b 參數引起的。 ## 錯誤處理 我們可以使用兩個函數:assert 和 error 來處理錯誤。實例如下: ``` local function add(a,b) assert(type(a) == "number", "a 不是一個數字") assert(type(b) == "number", "b 不是一個數字") return a+b end add(10) ``` 執行以上程序會出現如下錯誤: ``` lua: test.lua:3: b 不是一個數字 stack traceback: [C]: in function 'assert' test.lua:3: in local 'add' test.lua:6: in main chunk [C]: in ? ``` 實例中assert首先檢查第一個參數,若沒問題,assert不做任何事情;否則,assert以第二個參數作為錯誤信息拋出。 ### error函數 語法格式: ``` error (message [, level]) ``` 功能:終止正在執行的函數,并返回message的內容作為錯誤信息(error函數永遠都不會返回) 通常情況下,error會附加一些錯誤位置的信息到message頭部。 Level參數指示獲得錯誤的位置: * Level=1[默認]:為調用error位置(文件+行號) * Level=2:指出哪個調用error的函數的函數 * Level=0:不添加錯誤位置信息 ## pcall 和 xpcall、debug Lua中處理錯誤,可以使用函數pcall(protected call)來包裝需要執行的代碼。 pcall接收一個函數和要傳遞個后者的參數,并執行,執行結果:有錯誤、無錯誤;返回值true或者或false, errorinfo。 語法格式如下 ``` if pcall(function_name, ….) then -- 沒有錯誤 else -- 一些錯誤 end ``` 簡單實例: ``` > =pcall(function(i) print(i) end, 33) 33 true > =pcall(function(i) print(i) error('error..') end, 33) 33 false stdin:1: error.. ``` <p這里注意對返回值的邏輯判斷:< p=""> ``` > function f() return false,2 end > if f() then print '1' else print '0' end 0 ``` pcall以一種"保護模式"來調用第一個參數,因此pcall可以捕獲函數執行中的任何錯誤。 通常在錯誤發生時,希望落得更多的調試信息,而不只是發生錯誤的位置。但pcall返回時,它已經銷毀了調用桟的部分內容。 Lua提供了xpcall函數,xpcall接收第二個參數——一個錯誤處理函數,當錯誤發生時,Lua會在調用桟展看(unwind)前調用錯誤處理函數,于是就可以在這個函數中使用debug庫來獲取關于錯誤的額外信息了。 debug庫提供了兩個通用的錯誤處理函數: * debug.debug:提供一個Lua提示符,讓用戶來價差錯誤的原因 * debug.traceback:根據調用桟來構建一個擴展的錯誤消息 >=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33) 33 stack traceback: stdin:1: in function <stdin:1>[C]: in function 'error' stdin:1: in function <stdin:1>[C]: in function 'xpcall' stdin:1: in main chunk [C]: in ? false nil xpcall 使用實例 2: ``` function myfunction () n = n/nil end function myerrorhandler( err ) print( "ERROR:", err ) end status = xpcall( myfunction, myerrorhandler ) print( status) ``` 執行以上程序會出現如下錯誤: ``` ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value) false ```
                  <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>

                              哎呀哎呀视频在线观看