File: rescue_captures.rb

package info (click to toggle)
ruby3.4 3.4.5-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 154,784 kB
  • sloc: ruby: 1,259,653; ansic: 829,955; yacc: 28,233; pascal: 7,359; sh: 3,864; python: 1,799; cpp: 1,158; asm: 808; makefile: 801; javascript: 414; lisp: 109; perl: 62; awk: 36; sed: 4; xml: 4
file content (107 lines) | stat: -rw-r--r-- 1,992 bytes parent folder | download | duplicates (6)
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
107
module RescueSpecs
  class Captor
    attr_accessor :captured_error

    def self.should_capture_exception
      captor = new
      captor.capture('some text').should == :caught # Ensure rescue body still runs
      captor.captured_error.message.should == 'some text'
    end
  end

  class ClassVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => @@captured_error
      :caught
    end

    def captured_error
      self.class.remove_class_variable(:@@captured_error)
    end
  end

  class ConstantCaptor < Captor
    # Using lambda gets around the dynamic constant assignment warning
    CAPTURE = -> msg {
      begin
        raise msg
      rescue => CapturedError
        :caught
      end
    }

    def capture(msg)
      CAPTURE.call(msg)
    end

    def captured_error
      self.class.send(:remove_const, :CapturedError)
    end
  end

  class GlobalVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => $captured_error
      :caught
    end

    def captured_error
      $captured_error.tap do
        $captured_error = nil # Can't remove globals, only nil them out
      end
    end
  end

  class InstanceVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => @captured_error
      :caught
    end
  end

  class LocalVariableCaptor < Captor
    def capture(msg)
      raise msg
    rescue => captured_error
      @captured_error = captured_error
      :caught
    end
  end

  class SafeNavigationSetterCaptor < Captor
    def capture(msg)
      raise msg
    rescue => self&.captured_error
      :caught
    end
  end

  class SetterCaptor < Captor
    def capture(msg)
      raise msg
    rescue => self.captured_error
      :caught
    end
  end

  class SquareBracketsCaptor < Captor
    def capture(msg)
      @hash = {}

      raise msg
    rescue => self[:error]
      :caught
    end

    def []=(key, value)
      @hash[key] = value
    end

    def captured_error
      @hash[:error]
    end
  end
end