1assert_equal %q{2}, %q{ 2 begin 3 1+1 4 ensure 5 2+2 6 end 7} 8assert_equal %q{4}, %q{ 9 begin 10 1+1 11 begin 12 2+2 13 ensure 14 3+3 15 end 16 ensure 17 4+4 18 end 19} 20assert_equal %q{4}, %q{ 21 begin 22 1+1 23 begin 24 2+2 25 ensure 26 3+3 27 end 28 ensure 29 4+4 30 begin 31 5+5 32 ensure 33 6+6 34 end 35 end 36} 37assert_equal %q{NilClass}, %q{ 38 a = nil 39 1.times{|e| 40 begin 41 rescue => err 42 end 43 a = err.class 44 } 45 a 46} 47assert_equal %q{RuntimeError}, %q{ 48 a = nil 49 1.times{|e| 50 begin 51 raise 52 rescue => err 53 end 54 a = err.class 55 } 56 a 57} 58assert_equal %q{}, %q{ 59 $! 60} 61assert_equal %q{FOO}, %q{ 62 begin 63 raise "FOO" 64 rescue 65 $! 66 end 67} 68assert_equal %q{FOO}, %q{ 69 def m 70 $! 71 end 72 begin 73 raise "FOO" 74 rescue 75 m() 76 end 77} 78assert_equal %q{[#<RuntimeError: BAR>, #<RuntimeError: FOO>]}, %q{ 79 $ans = [] 80 def m 81 $! 82 end 83 begin 84 raise "FOO" 85 rescue 86 begin 87 raise "BAR" 88 rescue 89 $ans << m() 90 end 91 $ans << m() 92 end 93 $ans 94} 95assert_equal %q{[#<RuntimeError: FOO>, #<RuntimeError: FOO>]}, %q{ 96 $ans = [] 97 def m 98 $! 99 end 100 101 begin 102 begin 103 raise "FOO" 104 ensure 105 $ans << m() 106 end 107 rescue 108 $ans << m() 109 end 110} 111assert_equal %q{[nil]}, %q{ 112 $ans = [] 113 def m 114 $! 115 end 116 def m2 117 1.times{ 118 begin 119 return 120 ensure 121 $ans << m 122 end 123 } 124 end 125 m2 126 $ans 127} 128assert_equal %q{ok}, %q{ 129 begin 130 raise 131 rescue 132 :ok 133 end 134} 135assert_equal %q{ok}, %q{ 136 begin 137 raise 138 rescue 139 :ok 140 ensure 141 :ng 142 end 143} 144assert_equal %q{RuntimeError}, %q{ 145 begin 146 raise 147 rescue => e 148 e.class 149 end 150} 151assert_equal %q{ng}, %q{ 152 begin 153 raise 154 rescue StandardError 155 :ng 156 rescue Exception 157 :ok 158 end 159} 160assert_equal %q{c}, %q{ 161 begin 162 begin 163 raise "a" 164 rescue 165 raise "b" 166 ensure 167 raise "c" 168 end 169 rescue => e 170 e.message 171 end 172} 173assert_equal %q{33}, %q{ 174 def m a, b 175 a + b 176 end 177 m(1, begin 178 raise 179 rescue 180 2 181 end) + 182 m(10, begin 183 raise 184 rescue 185 20 186 ensure 187 30 188 end) 189} 190assert_equal %q{3}, %q{ 191 def m a, b 192 a + b 193 end 194 m(begin 195 raise 196 rescue 197 1 198 end, 199 begin 200 raise 201 rescue 202 2 203 end) 204} 205assert_equal %q{ok3}, %q{ 206 class E1 < Exception 207 end 208 209 def m 210 yield 211 end 212 213 begin 214 begin 215 begin 216 m{ 217 raise 218 } 219 rescue E1 220 :ok2 221 ensure 222 end 223 rescue 224 :ok3 225 ensure 226 end 227 rescue E1 228 :ok 229 ensure 230 end 231} 232assert_equal %q{7}, %q{ 233 $i = 0 234 def m 235 iter{ 236 begin 237 $i += 1 238 begin 239 $i += 2 240 break 241 ensure 242 243 end 244 ensure 245 $i += 4 246 end 247 $i = 0 248 } 249 end 250 251 def iter 252 yield 253 end 254 m 255 $i 256} 257assert_equal %q{10}, %q{ 258 $i = 0 259 def m 260 begin 261 $i += 1 262 begin 263 $i += 2 264 return 265 ensure 266 $i += 3 267 end 268 ensure 269 $i += 4 270 end 271 p :end 272 end 273 m 274 $i 275} 276assert_equal %q{1}, %q{ 277 begin 278 1 279 rescue 280 2 281 end 282} 283assert_equal %q{4}, %q{ 284 begin 285 1 286 begin 287 2 288 rescue 289 3 290 end 291 4 292 rescue 293 5 294 end 295} 296assert_equal %q{3}, %q{ 297 begin 298 1 299 rescue 300 2 301 else 302 3 303 end 304} 305assert_equal %q{2}, %q{ 306 begin 307 1+1 308 rescue 309 2+2 310 ensure 311 3+3 312 end 313 } 314assert_equal %q{2}, %q{ 315 begin 316 1+1 317 rescue 318 2+2 319 ensure 320 3+3 321 end 322 } 323assert_equal %q{6}, %q{ 324 begin 325 1+1 326 rescue 327 2+2 328 else 329 3+3 330 ensure 331 4+4 332 end 333 } 334assert_equal %q{12}, %q{ 335 begin 336 1+1 337 begin 338 2+2 339 rescue 340 3+3 341 else 342 4+4 343 end 344 rescue 345 5+5 346 else 347 6+6 348 ensure 349 7+7 350 end 351 } 352assert_equal %q{ok}, %q{ # 353 proc{ 354 begin 355 raise 356 break 357 rescue 358 :ok 359 end 360 }.call 361} 362assert_equal %q{}, %q{ 363 proc do 364 begin 365 raise StandardError 366 redo 367 rescue StandardError 368 end 369 end.call 370} 371 372## 373assert_match /undefined method `foo\'/, %q{#` 374 STDERR.reopen(STDOUT) 375 class C 376 def inspect 377 bar {} 378 end 379 380 def bar 381 raise 382 ensure 383 end 384 end 385 C.new.foo 386}, "[ruby-dev:31407]" 387 388assert_equal 'nil', %q{ 389 doit = false 390 exc = nil 391 t = Thread.new { 392 begin 393 doit = true 394 sleep 10 395 ensure 396 exc = $! 397 end 398 } 399 Thread.pass until doit 400 t.kill 401 t.join 402 exc.inspect 403}, '[ruby-dev:32608]' 404 405assert_equal 'exception class/object expected', %q{ 406 class ZeroDivisionError 407 def self.new(message) 408 42 409 end 410 end 411 begin 412 1/0 413 rescue Exception => e 414 e.message 415 end 416}, '[ruby-core:24767]' 417 418assert_equal 'ok', %q{ 419 class C 420 def ===(o) 421 true 422 end 423 end 424 begin 425 begin 426 raise 427 rescue C.new 428 end 429 rescue TypeError 430 :ok 431 end 432} 433