Công cụ thành viên

Công cụ trang web


script:bai14

Xử lý lỗi trong script

Cách xử lý lỗi trong các script

Theo mặc định, Lua đã cung cấp sẵn cho chúng ta các hàm để xử lý lỗi, nhưng Mini World cũng đã có sẵn một số cơ chế bảo vệ, đặc biệt là với các phương thức được cung cấp cho tất cả các lớp. Vì vậy, khi sử dụng API của game, bạn sẽ không gặp nhiều lỗi như khi sử dụng Lua độc lập.

Các hàm xử lý lỗi tích hợp sẵn của Lua

Pcall

Hàm này là viết tắt của Protected Call (Gọi bảo vệ) và thường được sử dụng trong lập trình Lua. Nó khá giống với cấu trúc try-catch trong các ngôn ngữ lập trình khác, giúp thực thi một đoạn mã theo cách được bảo vệ.
Hàm pcall nhận hai tham số:

  • Một hàm sẽ được thực thi.
  • Và các đối số của hàm đó.

Mục đích của pcall là để bắt bất kỳ lỗi nào có thể xảy ra trong quá trình thực thi hàm được cung cấp.

  • Nếu xảy ra lỗi, pcall trả về false cùng với thông báo lỗi.
  • Nếu không có lỗi, nó trả về true và kết quả thực thi của hàm.

Chúng ta có thể sử dụng hàm pcall như sau:

success, result = pcall(PossibleErrorFunc, argsToFunc,)

Ví dụ sử dụng:

-- Function that may produce an error
function divide(a, b)
    if b == 0 then
        error("Division by zero")
    end
    return a / b
end
 
-- Using pcall to protect the call function
local success, result = pcall(divide, 10, 2)
 
--If no errors encountered then else
if success then
    print("Result:", result)
else
    print("Error:", result)  -- This will print the error message if an error occurs
end

Nếu có bất kỳ lỗi nào khi hàm được thực thi thì biến “result” (biến thứ hai) sẽ trả về thông báo lỗi. Nếu không có lỗi thì hàm sẽ trả về kết quả mà hàm của chúng ta đã trả về, và biến success sẽ là true nếu không có lỗi.

Xpcall

Phương thức này là viết tắt của External Protected Call (Gọi được bảo vệ từ bên ngoài) và như tên gọi, nó cho phép thực thi một hàm theo cách được bảo vệ, nhưng nó cũng bao gồm một hàm xử lý lỗi có thể được chỉ định để xử lý lỗi theo cách tùy chỉnh hơn.
Chúng ta có thể sử dụng phương thức xpcall theo cách này:

success, result = xpcall(possibleErrorFunc, errorHandlerFunc, ArgsToFunc,)

Ví dụ sử dụng:

-- Function that may produce an error
function divide(a, b)
    if b == 0 then
        error("Division by zero")
    end
    return a / b
end
 
-- Error handling function
function errorHandler(err)
    return "An error occurred: " .. err
end
 
-- Using xpcall to protect the function calling
local success, result = xpcall(divide, errorHandler, 10, 0)
 
-- Checking the result
if success then
    print("Result:", result)
else
    print(result)  -- This will print the customized error message from the errorHandler function
end

Assert

Hàm assert trong Lua không được dùng riêng để xử lý ngoại lệ hay lỗi như pcall hay xpcall. Thay vào đó, assert được sử dụng để kiểm tra xem một điều kiện cho trước có đúng hay không. Nếu điều kiện đó sai, assert sẽ gây ra lỗi kèm theo một thông báo tùy chọn.

Mặc dù điều này có vẻ không quan trọng lúc đầu, ta có thể tạo các thông báo lỗi tùy chỉnh và xử lý chúng bằng pcall. Ví dụ, nếu bạn đang tạo một hệ thống lệnh và một admin sử dụng một lệnh không tồn tại, bạn có thể ném lỗi tùy chỉnh bằng assert và hiển thị lỗi đó cho người chơi đã thực thi lệnh.

Chúng ta có thể dùng hàm assert theo cách sau:

assert(conditionToCheck, errorMessage)

Ví dụ sử dụng:

-- Function that checks a condition using assert
function divide(a, b)
    assert(b ~= 0, "Division by zero is not allowed")
    return a / b
end
 
-- Example of using the divide function with assert
local result = divide(10, 2)
print("Result:", result)
 
-- Attempting division by zero, which will raise an error
result = divide(5, 0)
print("Result:", result)  -- This line will not be executed if there is an error in the divide function

Phương thức error

Cả assert và phương thức error đều có thể được sử dụng để ném ra lỗi tùy chỉnh, nhưng assert thường được dùng để kiểm tra điều kiện và ném lỗi nếu điều kiện đó không được thỏa mãn, trong khi error() được dùng trực tiếp để ném lỗi với thông báo cụ thể. Cả hai đều có thể được xử lý bằng pcall nếu cần.

Chúng ta có thể sử dụng phương thức error theo cách sau:

error(errorMessage)

Ví dụ sử dụng:

-- Function that uses error and will be handled by pcall
function divide(a, b)
    if b == 0 then
        error("Division by zero is not allowed")
    end
    return a / b
end
 
-- Using pcall to handle errors
local success, result = pcall(function()
    return divide(10, 2)
end)
 
if not success then
    print("Error:", result)
else
    print("Result:", result)
end

Xử lý lỗi trong script của Mini World

Mini World có một số cách để xử lý lỗi. Nếu một số phương thức của API gặp lỗi vì bất kỳ lý do nào, thì vẫn có cách để chúng ta xử lý chúng. Điều đầu tiên mà hầu hết các phương thức trả về là Mã lỗi (ErrorCode). Có hai loại mã lỗi:

  • ErrorCode.OK (Không có lỗi khi thực thi phương thức, giá trị là 0)
  • ErrorCode.FAILED (Có lỗi xảy ra khi thực thi phương thức, giá trị là 1001)

Cách đơn giản nhất để sử dụng là tạo một biến và dùng phương thức đó trong biến, theo cú pháp:

result = yourmethod(yourargs)

Ví dụ sử dụng:

  local result = Player:setPosition(0,100,7,100) 
  if result == 1001 then --An error was found
    -- DO something
  else --There werent any errors
    -- DO something
  end
 

script/bai14.txt · Sửa đổi lần cuối: 2025/05/16 09:00 bởi leo