gpt4 book ai didi

ruby - 为什么 ruby 不引发异常?

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:07 25 4
gpt4 key购买 nike

我有以下代码:

require 'open-uri'

class CustomException < StandardError;end

def file
f = Kernel.open('http://i.dbastatic.dk/images/2/68/500656768_20012012182407_0401_2.jpg')
return f
rescue => e
raise CustomException.new(e.message)
end

现在,如果我执行以下操作:

begin
file.body
rescue CustomException
puts "rescued it!"
end

我得到:

NoMethodError: undefined method `body' for nil:NilClass

而不是来自打开 uri 的带有 404 错误消息的 CustomException。奇怪的是,如果我改为:

begin
f = file
f.body
rescue CustomException
puts "rescued it!"
end

然后它起作用了,在它尝试执行 .body 之前,我得到了我可以捕获的 CustomException。我不明白为什么?以及如何更改文件方法以按预期执行?

最佳答案

只需稍作修改即可显示问题:

require 'open-uri'

def file
f = Kernel.open('fill_in_some_url_that_returns_a_404')
return f
rescue => e
puts e.message
1 ##<<---- inserted
end

file.body

不,你得到一个 undefined method 'body' for 1:Fixnum

解释:您的方法执行 puts e.message,但它不返回结果(或者换句话说:它返回 nil。)

使用 file.body 调用 file(结果为 nil)。并根据这个结果调用 body。但这对于 nil 不存在。所以你得到错误 undefined method 'body' for nil:NilClass

如果我尝试

f = file
f.body

我得到了同样的错误。

您确定,您在两个调用中使用相同的 url 吗?如果您可以打开您的网址,则您将重新运行一个有效的对象。


实际上,如果没有更多代码,我看不到你的问题。

你可以检查你的代码一件事:

如果您定义了一个变量一个方法file,那么您就得到了这个变量。请参见下面的示例。也许这就是问题所在。

file = nil
def file
1
end

file.body #undefined method `body' for nil:NilClass (NoMethodError)
file().body #undefined method `body' for 1:Fixnum (NoMethodError)

要确保获得该方法,您可以尝试 file()

关于ruby - 为什么 ruby 不引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12467490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com