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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# File 'lib/hammertime19.rb', line 46
def hammertime_raise(*args)
backtrace = caller(2)
fallback = lambda do
hammertime_original_raise(*args)
end
exclusive_and_non_reentrant(fallback) do
error, backtrace =
case args.size
when 0 then [($!.nil? ? RuntimeError.new : $!), backtrace]
when 1 then
if args[0].is_a?(String)
[RuntimeError.exception(args[0]), backtrace]
else
[args[0].exception, backtrace]
end
when 2 then
[args[0].exception(args[1]), backtrace]
when 3 then
[args[0].exception(args[1]), args[2]]
else
super(ArgumentError, "wrong number of arguments", backtrace)
end
error.set_backtrace(backtrace)
if hammertime_ignore_error?(error, backtrace)
hammertime_original_raise(error)
else
::Hammertime.stopped = true
end
c = ::Hammertime.hammertime_console
c.say "\n"
c.say "=== Stop! Hammertime. ==="
c.say "An error has occurred at #{backtrace.first}"
c.say "The error is: #{error.inspect}"
= lambda do ||
.prompt = "What now?"
.default = "Continue"
.select_by = :index_or_name
.choice "Continue (process the exception normally)" do
hammertime_original_raise(error)
true
end
.choice "Ignore (proceed without raising an exception)" do
true
end
.choice "Permit by type (don't ask about future errors of this type)" do
::Hammertime.ignored_errors << error.class
c.say "Added #{error.class} to permitted error types"
hammertime_original_raise(error)
true
end
.choice "Permit by line (don't ask about future errors raised from this point)" do
::Hammertime.ignored_lines << backtrace.first
c.say "Added #{backtrace.first} to permitted error lines"
hammertime_original_raise(error)
true
end
.choice "Backtrace (show the call stack leading up to the error)" do
backtrace.each do |frame| c.say frame end
false
end
if Hammertime.debug_supported?
.choice "Debug (start a debugger)" do
debugger
false
end
end
.choice "Console (start a pry session)" do
yield.pry
false
end
end
continue = c.choose(&) until continue
end
ensure
::Hammertime.stopped = false
end
|