Lua - Xử lý Lỗi

Xin chào các bạn đang học lập trình! Hôm nay, chúng ta sẽ cùng nhau khám phá thế giới xử lý lỗi trong Lua. Đừng lo lắng nếu bạn chưa từng viết một dòng mã nào trước đây - tôi sẽ hướng dẫn bạn từng bước, giống như tôi đã làm với hàng trăm học viên trong những năm dạy học của mình. Vậy, hãy cùng nhau bắt đầu hành trình thú vị này nhé!

Lua - Error Handling

Tại sao cần Xử lý Lỗi

Hãy tưởng tượng bạn đang nướng bánh kem lần đầu tiên. Bạn làm theo công thức cẩn thận, nhưng đột nhiên nhận ra bạn đã hết đường. Bạn sẽ làm gì? Bạn không thể tiếp tục nướng bánh mà thiếu nguyên liệu quan trọng này, phải không? Đây là lúc xử lý lỗi phát huy tác dụng trong lập trình.

Trong thế giới lập trình, lỗi giống như những nguyên liệu thiếu trong công thức của chúng ta. Chúng có thể xảy ra vì nhiều lý do khác nhau:

  1. Đầu vào không hợp lệ từ người dùng
  2. Vấn đề mạng
  3. Vấn đề hệ thống tệp
  4. Lỗi logic trong mã của chúng ta

Nếu không có xử lý lỗi thích hợp, chương trình của chúng ta có thể bị crash hoặc tạo ra kết quả không mong muốn. Đó là lý do tại sao việc học cách xử lý lỗi một cách từ từ lại rất quan trọng.

Hàm Assert và Error

Hàm Assert

Hãy bắt đầu với hàm assert. Hàm này giống như một người bảo vệ cảnh giác kiểm tra xem một điều kiện có đúng hay không. Nếu không đúng, nó sẽ gây ra một lỗi.

Dưới đây là một ví dụ đơn giản:

local age = 15
assert(age >= 18, "Bạn phải đủ 18 tuổi hoặc lớn hơn để vào!")
print("Chào mừng đến với câu lạc bộ!")

Nếu bạn chạy đoạn mã này, bạn sẽ thấy thông báo lỗi:

lua: example.lua:2: Bạn phải đủ 18 tuổi hoặc lớn hơn để vào!

Hàm assert kiểm tra xem age >= 18 có đúng hay không. Vì nó không đúng, nên nó đã gây ra một lỗi với thông báo tùy chỉnh của chúng ta.

Hàm Error

Bây giờ, hãy gặp hàm error. Hàm này cho phép chúng ta tạo ra lỗi tùy chỉnh khi cần thiết.

Dưới đây là một ví dụ:

local function divide(a, b)
if b == 0 then
error("Không thể chia cho không!")
end
return a / b
end

print(divide(10, 2))  -- Đây sẽ hoạt động tốt
print(divide(10, 0))  -- Đây sẽ gây ra lỗi

Khi bạn chạy đoạn mã này, bạn sẽ thấy:

5
lua: example.lua:3: Không thể chia cho không!

Đoạn mã print đầu tiên hoạt động tốt, nhưng đoạn mã thứ hai kích hoạt lỗi vì chúng ta đang cố gắng chia cho không.

pcall và xpcall

Bây giờ, hãy tìm hiểu về hai hàm mạnh mẽ giúp chúng ta xử lý lỗi: pcallxpcall.

Hàm pcall

pcall có nghĩa là "gọi bảo vệ". Nó cho phép chúng ta gọi một hàm trong chế độ bảo vệ, bắt được bất kỳ lỗi nào có thể xảy ra.

Dưới đây là một ví dụ:

local function riskyFunction()
error("Oops! Something went wrong!")
end

local success, errorMessage = pcall(riskyFunction)

if success then
print("Hàm đã chạy thành công!")
else
print("Đã xảy ra lỗi:", errorMessage)
end

Khi bạn chạy đoạn mã này, bạn sẽ thấy:

Đã xảy ra lỗi: example.lua:2: Oops! Something went wrong!

pcall trả về hai giá trị: một giá trị boolean cho biết thành công hay thất bại, và hoặc là giá trị trả về của hàm (nếu thành công) hoặc là thông báo lỗi (nếu thất bại).

Hàm xpcall

xpcall giống như anh em thông minh hơn của pcall. Nó cho phép chúng ta cung cấp một hàm xử lý lỗi tùy chỉnh.

Dưới đây là một ví dụ:

local function errorHandler(err)
print("CUSTOM ERROR HANDLER:")
print(debug.traceback("Error: " .. tostring(err), 2))
return "Lỗi đã được xử lý!"
end

local function riskyFunction()
error("Danger, Will Robinson!")
end

local success, result = xpcall(riskyFunction, errorHandler)

if success then
print("Hàm đã chạy thành công!")
else
print("Đã xảy ra lỗi. Kết quả:", result)
end

Khi bạn chạy đoạn mã này, bạn sẽ thấy một thông báo lỗi chi tiết:

CUSTOM ERROR HANDLER:
Error: Danger, Will Robinson!
stack traceback:
example.lua:7: in function 'riskyFunction'
[C]: in function 'xpcall'
example.lua:11: in main chunk
[C]: in ?
Đã xảy ra lỗi. Kết quả: Lỗi đã được xử lý!

Điều này cung cấp cho chúng ta nhiều thông tin hơn về nơi và tại sao lỗi xảy ra.

Phương pháp Xử lý Lỗi

Dưới đây là bảng tóm tắt các phương pháp xử lý lỗi mà chúng ta đã học:

Phương pháp Mô tả Trường hợp sử dụng
assert Kiểm tra một điều kiện và gây ra lỗi nếu nó sai Xác minh đầu vào
error Gây ra một lỗi tùy chỉnh Khi một điều kiện lỗi cụ thể được満た
pcall Gọi một hàm trong chế độ bảo vệ Khi bạn muốn bắt và xử lý lỗi
xpcall Gọi một hàm trong chế độ bảo vệ với một hàm xử lý lỗi tùy chỉnh Khi bạn cần thông tin lỗi chi tiết

Nhớ rằng, xử lý lỗi đúng cách giống như việc đeo dây an toàn khi lái xe. Nó có thể看起来 không cần thiết khi mọi thứ đều suôn sẻ, nhưng nó có thể cứu bạn khỏi rất nhiều rắc rối khi mọi thứ出错!

Thực hành các khái niệm này, thử nghiệm với các kịch bản khác nhau, và sớm bạn sẽ xử lý lỗi như một chuyên gia. Chúc các bạn lập trình vui vẻ và đừng quên đón nhận lỗi - chúng chỉ là cơ hội để học hỏi và cải thiện mã của bạn!

Credits: Image by storyset