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

message An explicit message is often enough when the caller can continue with a safe alternative.

Error Status

role
error_status.lua
Replay: real traced execution (multi-file project)
local role = "guest"
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 = "admin"
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 = "editor"
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)
  1. role ← guest, ok ← false, access ← denied, message ← admin required

    1local role→ guest = "guest" --@role="admin", "editor"2local ok→ false = roleguest == "admin"3local access→ denied = "denied"4local message→ admin required = "admin required"56if ok then7  access = "allowed"8  message = "ok"9end1011print("role=" .. roleguest)12print("ok=" .. tostring(okfalse))13print("access=" .. accessdenied)14print("message=" .. messageadmin required)
    outputrole=guest
    ok=false
    access=denied
    message=admin required
  1. role ← admin, ok ← true, access ← denied, message ← admin required

    1local role→ admin = "admin"2local ok→ true = roleadmin == "admin"3local access→ denied = "denied"4local message→ admin required = "admin required"
  2. access ← allowed, message ← ok

    6if oktrue then7  access→ allowed = "allowed"8  message→ ok = "ok"9end
  3. print("role=" .. role)

    11print("role=" .. roleadmin)12print("ok=" .. tostring(oktrue))13print("access=" .. accessallowed)14print("message=" .. messageok)
    outputrole=admin
    ok=true
    access=allowed
    message=ok
  1. role ← editor, ok ← false, access ← denied, message ← admin required

    1local role→ editor = "editor"2local ok→ false = roleeditor == "admin"3local access→ denied = "denied"4local message→ admin required = "admin required"56if ok then7  access = "allowed"8  message = "ok"9end1011print("role=" .. roleeditor)12print("ok=" .. tostring(okfalse))13print("access=" .. accessdenied)14print("message=" .. messageadmin required)
    outputrole=editor
    ok=false
    access=denied
    message=admin required