关于ruby:为什么我不能在“调用者”方法中捕获测试异常?

Why can't I catch the test exception in the “caller” method?

我不明白为什么这段代码不能正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
def test
  raise Exception.new 'error'
end

def caller
  begin
    test
  rescue =>e
     puts e.message
  end
end

caller

我想在caller方法中捕获测试异常,但似乎caller方法没有捕获任何东西。


您的代码不起作用的原因是因为没有明确声明的异常类型的rescue只捕获StandardError,它是exception的子类。 由于你正在提高exception,它高于StandardError,你的rescue不能捕获它。

通常,您希望使用更具体的异常,并且几乎不需要在StandardError上使用exception

例如,这可以正常工作:

1
2
3
4
5
6
7
begin
  raise StandardError.new 'Uh-oh!'
rescue => e
  p e.message
end

#=> Uh-oh!


您应该指定rescue所需的异常类型。 尝试

1
  rescue Exception => e


简打败了我,但......

=> var语法与exception一起使用时,必须指定要拯救的异常类型。 所有异常的基类都是Exception,因此如果将其更改为rescue Exception => e,它将起作用。 此外,当您从中获取的是整个方法时,您不需要显式的开始...结束块......

1
2
3
4
5
6
7
8
9
10
11
def test
  raise Exception.new 'error'
end

def caller
  test
rescue Exception =>e
  puts e.message
end

caller()