mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
eebda40507
We need to expose `error()` in Lua in order to let it call the error handler function. However, for that the base library needs to be available in the Lua state. Without this fix the output of the program is `call failed, sol::error::what() is Handled this message: [string "..."]:7: attempt to call a nil value (global 'error')` while it's supposed to be `call failed, sol::error::what() is Handled this message: [string "..."]:7: negative number detected`
50 lines
1.1 KiB
C++
50 lines
1.1 KiB
C++
#define SOL_CHECK_ARGUMENTS
|
|
#include <sol.hpp>
|
|
|
|
#include <iostream>
|
|
|
|
int main() {
|
|
std::cout << "=== protected_functions example ===" << std::endl;
|
|
|
|
sol::state lua;
|
|
lua.open_libraries(sol::lib::base);
|
|
|
|
// A complicated function which can error out
|
|
// We define both in terms of Lua code
|
|
|
|
lua.script(R"(
|
|
function handler (message)
|
|
return "Handled this message: " .. message
|
|
end
|
|
|
|
function f (a)
|
|
if a < 0 then
|
|
error("negative number detected")
|
|
end
|
|
return a + 5
|
|
end
|
|
)");
|
|
|
|
// Get a protected function out of Lua
|
|
sol::protected_function f = lua["f"];
|
|
// Set a non-default error handler
|
|
f.error_handler = lua["handler"];
|
|
|
|
sol::protected_function_result result = f(-500);
|
|
if (result.valid()) {
|
|
// Call succeeded
|
|
int x = result;
|
|
std::cout << "call succeeded, result is " << x << std::endl;
|
|
}
|
|
else {
|
|
// Call failed
|
|
sol::error err = result;
|
|
std::string what = err.what();
|
|
std::cout << "call failed, sol::error::what() is " << what << std::endl;
|
|
// 'what' Should read
|
|
// "Handled this message: negative number detected"
|
|
}
|
|
|
|
std::cout << std::endl;
|
|
}
|