Latest web development tutorials

Lua Penanganan Kesalahan

Program menjalankan kesalahan penanganan yang diperlukan, di operasi file, transfer data dan layanan web kami doa akan muncul kesalahan tak terduga. Jika Anda tidak memperhatikan menangani pesan error, menurut informasi akan bocor, tidak bisa berjalan dan sebagainya.

Setiap bahasa pemrograman, penanganan error diperlukan. jenis kesalahan adalah:

  • Kesalahan sintaks
  • Runtime error

Kesalahan sintaks

kesalahan sintaks biasanya karena komponen program (seperti operator, ekspresi) yang disebabkan oleh penggunaan yang tidak benar. Contoh sederhana adalah sebagai berikut:

-- test.lua 文件
a == 2

Kode di atas dijalankan sebagai akibat dari:

lua: test.lua:2: syntax error near '=='

Seperti yang Anda lihat, ada lebih dari satu kesalahan sintaks, sebuah "=" tanda diikuti oleh dua "=" tanda berbeda. A "=" adalah tugas ekspresi dua "=" adalah operasi perbandingan.

Contoh lain:

for a= 1,10
   print(a)
end

Program di atas akan muncul kesalahan berikut:

lua: test2.lua:2: 'do' expected near 'print'

kesalahan sintaks lebih mudah daripada menjalankan kesalahan program, menjalankan kesalahan tidak dapat menemukan kesalahan tertentu, kesalahan tata bahasa yang kita dapat dengan cepat menyelesaikan, seperti contoh di atas selama kita lakukan dalam untuk pernyataan dapat ditambahkan:

for a= 1,10
do
   print(a)
end

Runtime error

Jalankan program dapat melakukan kesalahan adalah normal, tapi itu akan menampilkan pesan kesalahan. Berikut ini contoh karena kesalahan parameter input, kesalahan eksekusi program:

function add(a,b)
   return a+b
end

add(10)

Ketika kita mengkompilasi dan menjalankan kode berikut, compiler bisa sukses, tetapi pada saat dijalankan akan menghasilkan error berikut:

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]: ?

Pesan kesalahan berikut ini disebabkan karena program ini tidak memiliki parameter b.


Penanganan kesalahan

Kita dapat menggunakan dua fungsi: menegaskan and error untuk menangani kesalahan. Contohnya adalah sebagai berikut:

local function add(a,b)
   assert(type(a) == "number", "a 不是一个数字")
   assert(type(b) == "number", "b 不是一个数字")
   return a+b
end
add(10)

Program di atas akan muncul kesalahan berikut:

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 ?

Misalnya menegaskan pemeriksaan pertama argumen pertama, jika tidak ada masalah, menegaskan tidak apa-apa, jika tidak, argumen kedua untuk menegaskan pesan kesalahan dilemparkan.

fungsi kesalahan

sintaks:

error (message [, level])

: Menghentikan fungsi dieksekusi, dan mengembalikan isi pesan sebagai pesan error (kesalahan fungsi tidak akan pernah kembali)

Biasanya, kesalahan akan ada beberapa informasi tambahan tentang pesan kesalahan ke posisi kepala.

Tingkat parameter menunjukkan posisi untuk mendapatkan salah:

  • Tingkat = 1 [default]: Untuk memanggil error (file + nomor baris)
  • Tingkat = 2: fungsi yang memanggil fungsi kesalahan yang ditunjukkan
  • Tingkat = 0: tidak menambahkan lokasi kesalahan

pcall dan xpcall, debug

Lua kesalahan penanganan, Anda dapat menggunakan fungsi pcall (call dilindungi) untuk membungkus kode yang akan dieksekusi.

pcall menerima fungsi dan Anda ingin mengirimkan parameter yang terakhir, dan dieksekusi, hasilnya: ada kesalahan, tidak ada kesalahan, atau nilai kembali dari benar atau salah, ErrorInfo.

Sintaks adalah sebagai berikut

if pcall(function_name, ….) then
-- 没有错误
else
-- 一些错误
end

contoh sederhana:

> =pcall(function(i) print(i) end, 33)
33
true
   
> =pcall(function(i) print(i) error('error..') end, 33)
33
false        stdin:1: error..
> function f() return false,2 end
> if f() then print '1' else print '0' end
0

pcall dalam "modus dilindungi" untuk memanggil argumen pertama, karena itu pcall fungsi capture dapat melakukan kesalahan apapun.

Biasanya bila terjadi kesalahan, itu berharap untuk berakhir dengan informasi debugging lebih, tidak hanya di mana kesalahan terjadi. Tapi kembali pcall, telah menghancurkan bagian dari isi panggilan Zhan.

Lua menyediakan fungsi xpcall, xpcall menerima parameter kedua - handler kesalahan saat terjadi kesalahan, Lua error handler akan dipanggil sebelum memanggil acara Zhan untuk melihat (bersantai), maka Anda dapat menggunakan fungsi ini di perpustakaan men-debug untuk mendapatkan informasi tambahan tentang kesalahan.

men-debug perpustakaan menyediakan dua handler kesalahan umum:

  • debug.debug: Lua menyediakan prompt, yang memungkinkan pengguna untuk menyebarkan alasan yang salah
  • debug.traceback: Menurut Zhan panggilan untuk membangun sebuah pesan kesalahan diperpanjang
> = Xpcall (function (i) print (i) error ( 'error ..') end, function () print (debug.traceback ()) end, 33) 33 tumpukan traceback: stdin: 1: dalam fungsi [C]: dalam fungsi 'kesalahan' stdin: 1: dalam fungsi [C]: dalam fungsi 'xpcall' stdin: 1: di potongan utama [C] :? Dalam nil palsu

xpcall Contoh 2:

function myfunction ()
   n = n/nil
end

function myerrorhandler( err )
   print( "ERROR:", err )
end

status = xpcall( myfunction, myerrorhandler )
print( status)

Program di atas akan muncul kesalahan berikut:

ERROR:	test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false