sol2/examples/source/exception_handler.cpp
ThePhD 561c90abf4
Fix a lot of errors
- Add a new feature for SOL_FUNCTION_CALL_VALUE_SEMANTICS. Fixes #1059
- Detect deprecated/removed bit32 library. Fixes #1086
- Format the entire repository. Close #1073
- SOL_LUAJIT was not being properly defined. Close #1082
- Fix alignment issue. #1071
2020-12-16 15:25:35 -05:00

55 lines
1.7 KiB
C++

#define SOL_ALL_SAFETIES_ON 1
#include <sol/sol.hpp>
#include "assert.hpp"
#include <iostream>
int my_exception_handler(lua_State* L, sol::optional<const std::exception&> maybe_exception, sol::string_view description) {
// L is the lua state, which you can wrap in a state_view if necessary
// maybe_exception will contain exception, if it exists
// description will either be the what() of the exception or a description saying that we hit the general-case catch(...)
std::cout << "An exception occurred in a function, here's what it says ";
if (maybe_exception) {
std::cout << "(straight from the exception): ";
const std::exception& ex = *maybe_exception;
std::cout << ex.what() << std::endl;
}
else {
std::cout << "(from the description parameter): ";
std::cout.write(description.data(), static_cast<std::streamsize>(description.size()));
std::cout << std::endl;
}
// you must push 1 element onto the stack to be
// transported through as the error object in Lua
// note that Lua -- and 99.5% of all Lua users and libraries -- expects a string
// so we push a single string (in our case, the description of the error)
return sol::stack::push(L, description);
}
void will_throw() {
throw std::runtime_error("oh no not an exception!!!");
}
int main() {
std::cout << "=== exception_handler ===" << std::endl;
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.set_exception_handler(&my_exception_handler);
lua.set_function("will_throw", &will_throw);
sol::protected_function_result pfr = lua.safe_script("will_throw()", &sol::script_pass_on_error);
c_assert(!pfr.valid());
sol::error err = pfr;
std::cout << err.what() << std::endl;
std::cout << std::endl;
return 0;
}