Lua中簡單的錯誤處理例項

NO IMAGE

昨天遇到另外一位獨立遊戲開發者,所以多聊了一會,然後…然後就沒有看書了。(小若:藉口!藉口!)
 
今天來聊聊錯誤處理吧,不過畢竟這只是前面的章節,書上的內容似乎有點一筆帶過的味道。

沒關係,簡單更好~

1.紅色警報——error

我們應該能經常看到類似以下的錯誤資訊:
複製程式碼 程式碼如下:
[LUA-print] LUA ERROR: [string “src/main.lua”]:108: [string “src/main.lua”]:89: attempt to index global ‘a’ (a nil value)

這是在發生錯誤時給我們的提示,通常,這代表我們的程式碼不能繼續正常執行下去了。
 
但你有知不知道,我們可以偽造這種錯誤,沒錯,主動呼叫error函式,就會出現這種資訊。
如下程式碼:
複製程式碼 程式碼如下:
    error(“你的智商不多了,趕緊休息,恢復一下吧”);

然後,執行,輸出如下資訊:
複製程式碼 程式碼如下:
[LUA-print] LUA ERROR: [string “src/main.lua”]:109: [string “src/main.lua”]:96: 你的智商不多了,趕緊休息,恢復一下吧

這太厲害了,以後你看誰不爽,就往他程式碼裡塞上這句話吧,比如在專案上線前塞進去~
 
言歸正傳,當我們在呼叫一個函式之前,可以先判斷即將傳遞的引數是否正常,如果不正常,我們就可以選擇直接丟擲error,方便寫程式碼的過程中發現問題。

比如下面的程式碼:

複製程式碼 程式碼如下:
    local name = io.read();
    if name ~= “笨木頭” then
        error(“你是一個非常善良有愛心的人,我很喜歡你..所以,去死吧!”);
    end

只要發現輸入的內容不是“笨木頭”,就狠狠地丟擲異常。

2.偷個懶——assert

類似剛剛那種判斷錯誤的程式碼,似乎有點囉嗦,於是,我們可以用assert代替形如if not then的程式碼。

比如上面的程式碼改為:
複製程式碼 程式碼如下:
    local name = io.read();
    local result = assert(name == “笨木頭”, “你是一個非常善良有愛心的人,我很喜歡你..所以,去死吧!”);

如果assert的第一個引數為不為false,則返回第一個引數的值;否則,執行error函式,輸出錯誤資訊,錯誤資訊的內容為assert的第二個引數。

輸出結果和之前是一樣的~

3.捕獲錯誤程式碼——pcall

如果在錯誤發生時,我們不希望程式碼停止執行,而是做一些緊急措施,那麼,可以使用pcall捕獲錯誤。
如以下程式碼:
複製程式碼 程式碼如下:
    function test()
        print(a[1]);
    end
    if pcall(test) then
        print(“正常,呵呵”);
    else
        print(“哎,函式出錯了,我正在幫你處理,放心吧,等我睡醒就…不是,等你睡醒就沒事了~”);
      
    end

函式test執行的時候肯定會報錯的,因為並不存在a這個table。
使用pcall呼叫test函式,如果test不報錯,則pcall返回ture,否則,返回false。
利用這個特性,我們就可以捕獲異常,做一些緊急處理。

執行程式碼, 輸出結果如下:
複製程式碼 程式碼如下:
[LUA-print] 哎,函式出錯了,我正在幫你處理,放心吧,等我睡醒就…不是,等你睡醒就沒事了~
這緊急處理的方式還挺不錯的,呵呵。(小若:不錯你個頭啊!這和沒處理有差別嗎?)

pcall除了會返回true或者false外,還能返回函式的錯誤資訊,如下程式碼:
複製程式碼 程式碼如下:
    function test()
        print(a[1]);
    end
    local status, err = pcall(test);
    if status then
        print(“正常,呵呵”);
    else
        print(“哎,函式出錯了,我正在幫你處理,放心吧,等我睡醒就…不是,等你睡醒就沒事了~”);
        print(err);
    end

pcall的第一個返回值和之前一樣,true或者false。

而第二個引數則是test函式丟擲的錯誤資訊,執行程式碼,結果如下:
複製程式碼 程式碼如下:
[LUA-print] 哎,函式出錯了,我正在幫你處理,放心吧,等我睡醒就…不是,等你睡醒就沒事了~
[LUA-print] [string “src/main.lua”]:94: attempt to index global ‘a’ (a nil value)

4.結束

關於錯誤處理,好像沒有什麼好玩的東西,所以,就寫這麼多吧~

您可能感興趣的文章:

Lua中的異常處理pcall、xpcall、debug使用例項Lua函式與字串處理簡明總結Lua極簡入門指南(三): loadfile和錯誤處理Lua讀取和寫入檔案處理例子淺析Lua程式設計中的異常處理lua日誌檔案處理程式碼