Pengendalian ralat Lua
Pengendalian ralat diperlukan semasa pengendalian program Ralat yang tidak dijangka akan berlaku semasa operasi fail, pemindahan data dan panggilan perkhidmatan web. Jika anda tidak memberi perhatian kepada pengendalian mesej ralat, maklumat akan bocor dan program tidak akan dijalankan.
Pengendalian ralat diperlukan dalam mana-mana bahasa pengaturcaraan. Jenis ralat ialah:
Ralat sintaks
Ralat berjalan
Ralat sintaks
Ralat sintaks biasanya disebabkan oleh penggunaan komponen program yang tidak betul (seperti pengendali, ungkapan). Contoh mudah adalah seperti berikut:
-- test.lua 文件 a == 2
Hasil pelaksanaan kod di atas ialah:
lua: test.lua:2: syntax error near '=='
Seperti yang anda lihat, terdapat ralat sintaks di atas, satu "=" diikuti dengan dua "=" Terdapat perbezaan dalam bilangan. Satu "=" ialah ungkapan tugasan dan dua "=" ialah operasi perbandingan.
Contoh lain:
for a= 1,10 print(a) end
Ralat berikut akan berlaku apabila melaksanakan atur cara di atas:
lua: test2.lua:2: 'do' expected near 'print'
Ralat sintaks adalah lebih mudah daripada ralat menjalankan program tidak dapat mengesan ralat tertentu, dan ralat sintaks Kita boleh menyelesaikan ralat dengan cepat Contohnya, dalam contoh di atas, kita hanya perlu menambah do di bawah pernyataan for:
for a= 1,10 do print(a) end
Ralat berjalan
Ralat berjalan. bermakna bahawa program boleh dilaksanakan secara normal, tetapi ia akan Output mesej ralat. Dalam contoh berikut, disebabkan input parameter yang salah, ralat berlaku semasa pelaksanaan program:
function add(a,b) return a+b end add(10)
Apabila kami menyusun dan menjalankan kod berikut, kompilasi boleh berjaya, tetapi ralat berikut akan berlaku semasa operasi:
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]: ?
Mesej ralat berikut disebabkan oleh program kehilangan parameter b.
Ralat pengendalian
Kita boleh menggunakan dua fungsi: menegaskan dan ralat untuk mengendalikan ralat. Contohnya adalah seperti berikut:
local function add(a,b) assert(type(a) == "number", "a 不是一个数字") assert(type(b) == "number", "b 不是一个数字") return a+b end add(10)
Ralat berikut akan berlaku semasa melaksanakan program di atas:
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 ?
Dalam contoh, assert semak parameter pertama Jika tiada masalah, assert akan berlaku tidak melakukan apa-apa; jika tidak, tegaskan bermula dengan parameter pertama Kedua-dua parameter dilemparkan sebagai mesej ralat.
fungsi ralat
Format sintaks:
error (message [, level])
Fungsi: Tamatkan fungsi pelaksana dan kembalikan kandungan mesej sebagai maklumat ralat (fungsi ralat tidak akan kembali)
Biasanya, ralat akan menambahkan beberapa maklumat lokasi ralat pada pengepala mesej.
Parameter tahap menunjukkan lokasi ralat diperoleh:
Tahap=1 [Lalai]: Panggil lokasi ralat (nombor fail + talian)
Level=2: Tunjukkan fungsi mana yang memanggil fungsi ralat
Level=0: Jangan tambah maklumat lokasi ralat
pcall dan xpcall, debug
Untuk mengendalikan ralat dalam Lua, anda boleh menggunakan fungsi pcall (panggilan dilindungi) untuk membalut kod yang perlu dilaksanakan.
pcall menerima fungsi dan parameter yang akan dihantar kepada yang terakhir, dan melaksanakannya Hasil pelaksanaan ialah: ralat atau tiada ralat nilai pulangan adalah benar atau salah, errorinfo.
Format sintaks adalah seperti berikut
if pcall(function_name, ….) then -- 没有错误 else -- 一些错误 end
Contoh mudah:
> =pcall(function(i) print(i) end, 33) 33 true > =pcall(function(i) print(i) error('error..') end, 33) 33 false stdin:1: error..<pDi sini, perhatikan pertimbangan logik nilai pulangan:< p="">
> function f() return false,2 end > if f() then print '1' else print '0' end 0
pcall dalam "Mod dilindungi" untuk memanggil dengan hujah pertama, jadi pcall boleh menangkap sebarang ralat dalam pelaksanaan fungsi.
Selalunya apabila ralat berlaku, anda ingin mendapatkan lebih banyak maklumat penyahpepijatan, bukan hanya lokasi ralat itu berlaku. Tetapi apabila pcall kembali, ia telah memusnahkan sebahagian daripada timbunan panggilan.
Lua menyediakan fungsi xpcall menerima parameter kedua - fungsi pengendalian ralat Apabila ralat berlaku, Lua akan memanggil fungsi pengendalian ralat sebelum memanggil unwind, jadi ia boleh menjadi Pustaka nyahpepijat digunakan dalam ini. berfungsi untuk mendapatkan maklumat tambahan tentang ralat.
Pustaka nyahpepijat menyediakan dua fungsi pengendalian ralat umum:debug.debug: Menyediakan gesaan Lua untuk membolehkan pengguna mengetahui punca ralat penyebaran
debug.traceback: Bina mesej ralat lanjutan berdasarkan panggilan balik