Use an error status and message when the program can recover locally.

Error Status

error_status.lua
local role = 
local ok = role == "admin"
local access = "denied"
local message = "admin required"

if ok then
  access = "allowed"
  message = "ok"
end

print("role=" .. role)
print("ok=" .. tostring(ok))
print("access=" .. access)
print("message=" .. message)
local role = 
local ok = role == "admin"
local access = "denied"
local message = "admin required"

if ok then
  access = "allowed"
  message = "ok"
end

print("role=" .. role)
print("ok=" .. tostring(ok))
print("access=" .. access)
print("message=" .. message)
local role = 
local ok = role == "admin"
local access = "denied"
local message = "admin required"

if ok then
  access = "allowed"
  message = "ok"
end

print("role=" .. role)
print("ok=" .. tostring(ok))
print("access=" .. access)
print("message=" .. message)
message An explicit message is often enough when the caller can continue with a safe alternative.