1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
--
-- exception handler test module
--
--
-- To avoid this from crashing the module will startup in inactive mode.
-- to make specific errors happen you need to cause them by following
-- chat command:
--
-- exceptiontest <location> <errortype>
--
-- location has to be one of:
-- * mapgen: cause in next on_generate call
-- * entity_step: spawn a entity and make it do error in on_step
-- * globalstep: do error in next globalstep
-- * immediate: cause right in chat handler
--
-- errortypes defined are:
-- * segv: make sigsegv happen
-- * zerodivision: cause a division by zero to happen
-- * exception: throw an exception
if core.cause_error == nil or
type(core.cause_error) ~= "function" then
return
end
core.log("action", "WARNING: loading exception handler test module!")
local exceptiondata = {
tocause = "none",
mapgen = false,
entity_step = false,
globalstep = false,
}
local exception_entity =
{
on_step = function(self, dtime)
if exceptiondata.entity_step then
core.cause_error(exceptiondata.tocause)
end
end,
}
local exception_entity_name = "errorhandler_test:error_entity"
local function exception_chat_handler(playername, param)
local parameters = param:split(" ")
if #parameters ~= 2 then
core.chat_send_player(playername, "Invalid argument count for exceptiontest")
end
core.log("error", "Causing error at:" .. parameters[1])
if parameters[1] == "mapgen" then
exceptiondata.tocause = parameters[2]
exceptiondata.mapgen = true
elseif parameters[1] == "entity_step" then
--spawn entity at player location
local player = core.get_player_by_name(playername)
if player:is_player() then
local pos = player:getpos()
core.add_entity(pos, exception_entity_name)
end
exceptiondata.tocause = parameters[2]
exceptiondata.entity_step = true
elseif parameters[1] == "globalstep" then
exceptiondata.tocause = parameters[2]
exceptiondata.globalstep = true
elseif parameters[1] == "immediate" then
core.cause_error(parameters[2])
else
core.chat_send_player(playername, "Invalid error location: " .. dump(parameters[1]))
end
end
core.register_chatcommand("exceptiontest",
{
params = "<location> <errortype>",
description = "cause a given error to happen.\n" ..
" location=(mapgen,entity_step,globalstep,immediate)\n" ..
" errortype=(segv,zerodivision,exception)",
func = exception_chat_handler,
privs = { server=true }
})
core.register_globalstep(function(dtime)
if exceptiondata.globalstep then
core.cause_error(exceptiondata.tocause)
end
end)
core.register_on_generated(function(minp, maxp, blockseed)
if exceptiondata.mapgen then
core.cause_error(exceptiondata.tocause)
end
end)
core.register_entity(exception_entity_name, exception_entity)
|