Bài 18 : Lua – Xử lý lỗi
Bài 18 : Lua – Xử lý lỗi
Lua – Xử lý lỗi Trang trướcTrang tiếp theo Cần xử lý lỗi Việc xử lý lỗi là khá quan […]
Lua – Xử lý lỗi
Cần xử lý lỗi
Việc xử lý lỗi là khá quan trọng vì các hoạt động trong thế giới thực thường yêu cầu sử dụng các hoạt động phức tạp, bao gồm hoạt động tệp, giao dịch cơ sở dữ liệu và lệnh gọi dịch vụ web.
Trong bất kỳ lập trình nào, luôn có yêu cầu về xử lý lỗi. Lỗi có thể có hai loại bao gồm,
- Lỗi cú pháp
- Lỗi thời gian chạy
Lỗi cú pháp
Lỗi cú pháp xảy ra do việc sử dụng không đúng các thành phần chương trình khác nhau như toán tử và biểu thức. Dưới đây là một ví dụ đơn giản cho lỗi cú pháp.
a == 2
Như bạn đã biết, có sự khác biệt giữa việc sử dụng đơn “bằng với” và kép “bằng với”. Sử dụng cái này thay vì cái kia có thể dẫn đến lỗi. Một “bằng với” đề cập đến phép gán trong khi một “bằng với” gấp đôi dùng để so sánh. Tương tự, chúng ta có các biểu thức và hàm có các cách triển khai được xác định trước.
Một ví dụ khác cho lỗi cú pháp được hiển thị bên dưới:Bản thử trực tiếp
for a= 1,10 print(a) end
Khi chúng tôi chạy chương trình trên, chúng tôi sẽ nhận được kết quả sau:
lua: test2.lua:2: 'do' expected near 'print'
Lỗi cú pháp dễ xử lý hơn nhiều so với lỗi thời gian chạy vì trình thông dịch Lua định vị lỗi rõ ràng hơn so với trường hợp lỗi thời gian chạy. Từ lỗi trên, chúng ta có thể biết một cách dễ dàng rằng việc thêm một việc phải làm tuyên bố trước khi tuyên bố in được yêu cầu theo cấu trúc Lua.
Lỗi thời gian chạy
Trong trường hợp lỗi thời gian chạy, chương trình sẽ thực thi thành công, nhưng nó có thể dẫn đến lỗi thời gian chạy do sai sót trong đầu vào hoặc các hàm xử lý sai. Dưới đây là một ví dụ đơn giản để hiển thị lỗi thời gian chạy.Bản thử trực tiếp
function add(a,b) return a+b end add(10)
Khi chúng tôi xây dựng chương trình, nó sẽ xây dựng thành công và chạy. Khi nó chạy, hiển thị lỗi thời gian chạy.
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]: ?
Đây là lỗi thời gian chạy, đã xảy ra do không chuyển hai biến. Các b tham số được mong đợi và ở đây nó là con số không và tạo ra một lỗi.
Chức năng Khẳng định và Lỗi
Để xử lý lỗi, chúng ta thường sử dụng hai hàm – khẳng định và báo lỗi . Một ví dụ đơn giản được hiển thị bên dưới.Bản thử trực tiếp
local function add(a,b) assert(type(a) == "number", "a is not a number") assert(type(b) == "number", "b is not a number") return a+b end add(10)
Khi chúng tôi chạy chương trình trên, chúng tôi sẽ nhận được đầu ra lỗi sau.
lua: test2.lua:3: b is not a number stack traceback: [C]: in function 'assert' test2.lua:3: in function 'add' test2.lua:6: in main chunk [C]: ?
Các lỗi (thông báo [, mức]) chấm dứt chức năng bảo vệ cuối cùng gọi và nhắn tin lợi nhuận như các thông báo lỗi. Lỗi hàm này không bao giờ trả về. Thông thường, lỗi thêm một số thông tin về vị trí lỗi ở đầu thư. Đối số mức chỉ định cách lấy vị trí lỗi. Với mức 1 (mặc định), vị trí lỗi là nơi hàm lỗi được gọi. Mức 2 chỉ lỗi đến nơi mà hàm được gọi là lỗi đã được gọi; và như thế. Vượt qua mức 0 sẽ tránh được việc bổ sung thông tin vị trí lỗi vào thông báo.
pcall và xpcall
Trong lập trình Lua, để tránh ném ra các lỗi này và xử lý các lỗi, chúng ta cần sử dụng các hàm pcall hoặc xpcall.
Hàm pcall (f, arg1, …) gọi hàm được yêu cầu ở chế độ được bảo vệ. Nếu một số lỗi xảy ra trong hàm f, nó không tạo ra lỗi. Nó chỉ trả về trạng thái lỗi. Dưới đây là một ví dụ đơn giản sử dụng pcall.Bản thử trực tiếp
function myfunction () n = n/nil end if pcall(myfunction) then print("Success") else print("Failure") end Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau.
Failure
Hàm xpcall (f, err) gọi hàm được yêu cầu và cũng đặt trình xử lý lỗi. Bất kỳ lỗi nào bên trong f không được lan truyền; thay vào đó, xpcall bắt lỗi, gọi hàm err với đối tượng lỗi ban đầu và trả về mã trạng thái.
Một ví dụ đơn giản cho xpcall được hiển thị bên dưới.Bản thử trực tiếp
function myfunction () n = n/nil end function myerrorhandler( err ) print( "ERROR:", err ) end status = xpcall( myfunction, myerrorhandler ) print( status)
Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau.
ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value) false
Là một lập trình viên, điều quan trọng nhất là đảm bảo rằng bạn quan tâm đến việc xử lý lỗi thích hợp trong các chương trình bạn viết. Sử dụng xử lý lỗi có thể đảm bảo rằng các điều kiện bất ngờ ngoài điều kiện biên được xử lý mà không làm phiền người dùng chương trình.
Lượt xem : 228