我正在寻找这样的东西:
raise Exception rescue nil
Run Code Online (Sandbox Code Playgroud)
但我发现的最短路径是:
begin
raise Exception
rescue Exception
end
Run Code Online (Sandbox Code Playgroud) 这是一个广泛的问题,但在Ruby编程时我会继续遇到这个问题.我来自一个很大的C和Java背景,当我使用库函数或方法时,我查看文档并查看错误返回的内容(通常在C中)或它可以抛出的异常(在Java中).
在Ruby中,情况似乎完全不同.刚才我需要解析从服务器收到的一些JSON:
data = JSON.parse(response)
Run Code Online (Sandbox Code Playgroud)
当然,在编写这段代码后我想到的第一件事就是如果输入不好怎么办?是否parse会在出错时返回nil,或者引发一些异常,如果是,那是哪些?
我查看文档(http://flori.github.com/json/doc/JSON.html#M000022),看看,简单地说:
"将JSON字符串源解析为Ruby数据结构并将其返回."
这只是我在Ruby中反复遇到的模式的一个例子.最初,我认为这是我正在使用的任何库的文档的一些缺点,但现在我开始觉得这是标准的做法,我的思维方式与Ruby程序员有点不同.有一些我不知道的惯例吗?
开发人员如何处理这个问题?
(是的,我确实查看了库方法的代码,并且可以了解引发了什么异常,但我不能100%确定,如果没有记录,我会感到不舒服,依赖它.)
编辑:看完前两个答案后,让我继续上面的JSON解析示例.
我怀疑我不应该这样做:
begin
data = JSON.parse(response)
raise "parse error" if data.nil?
rescue Exception => e
# blahblah
end
Run Code Online (Sandbox Code Playgroud)
因为我可以查看代码/测试并看到它似乎引发了一个ParserError错误(返回nil似乎不是Ruby中的标准做法).我是否正确地说建议的做法是:
begin
data = JSON.parse(response)
rescue JSON::ParserError => e
# blahblah
end
Run Code Online (Sandbox Code Playgroud)
...基于我ParserError通过查看代码和测试了解到的内容?
(我还编辑了这个例子,以澄清它是我正在解析的服务器的响应.)
如何在执行rake db:setup之前检查数据库是否存在于rails中?
我想在db:create完成之前检查数据库是否已经存在.到目前为止,我还没有在rails中看到过具体的方法,但我知道这可以使用mysql脚本完成
我有一个简单的问题.我有一个连接表,其索引确保(col 1,col 2)是唯一的.
我使用mysql2 gem添加到该表,并尝试捕获Mysql2 :: Error,如果尝试导致重复键错误.当我收到重复键错误时,我的救援主体没有被执行.
begin
self.foo << bar
rescue Mysql2::Error
logger.debug("#{$!}")
end
Run Code Online (Sandbox Code Playgroud)
执行时我收到以下错误 self.foo << bar
Mysql2 ::错误:键'index_foos_bars_on_foo_id_and_bar_id'的重复条目'35455-6628':INSERT INTO foos_bars(foo_id,bar_id)VALUES(35455,6628)
但我的救援声明没有被击中!该例外未能成功获救.我究竟做错了什么?如果我删除Mysql2 :: Error并为所有事情进行救援,那么它可行.但这是不好的做法 - 我只是想在重复输入的情况下从Mysql2 :: Error中解救出来.
谢谢,
我有一个重试块
def my_method
app_instances = []
attempts = 0
begin
app_instances = fetch_and_rescan_app_instances(page_n, policy_id, policy_cpath)
rescue Exception
attempts += 1
retry unless attempts > 2
raise Exception
end
page_n += 1
end
Run Code Online (Sandbox Code Playgroud)
其中fetch_and_rescan_app_instances接入网络等都可以抛出异常.
我想编写一个rspec测试,它第一次抛出异常并且第二次调用它时不会抛出异常,所以我可以测试第二次它是不会抛出异常,my_method不会抛出异常exeption.
我知道我可以做stub(:fetch_and_rescan_app_instances).and_return(1,3),第一次它返回1和第二次3,但我不知道如何做第一次抛出异常并返回第二次.
如何将模型代码中发生的错误消息发送回视图.我的意思是.我有一个
begin
Some code
rescue
Exception Handling
end
Run Code Online (Sandbox Code Playgroud)
现在出现错误,在救援中,我想将一条消息发送回控制器,以便它在视图中显示.我是否必须使用一个变量,该变量必须包含一个请求中出现的大量错误消息,将它们连接起来并将其发送回控制器,以便我可以在视图中显示它?Rails已经显示一些错误消息,如字段不能为空.我问的是其他异常,它们出现在模型代码中的函数中.
我正在使用Nokogiri来抓取网页.几个网址需要被猜到,并且当它们不存在时返回404未找到错误.有没有办法捕获此异常?
http://yoursite/page/38475 #=> page number 38475 doesn't exist
Run Code Online (Sandbox Code Playgroud)
我尝试了以下哪些不起作用.
url = "http://yoursite/page/38475"
doc = Nokogiri::HTML(open(url)) do
begin
rescue Exception => e
puts "Try again later"
end
end
Run Code Online (Sandbox Code Playgroud) 我想知道如何在resue块中访问ActiveJob执行参数,例如
def perform object
end
rescue_from Exception do |e|
if e.class != ActiveRecord::RecordNotFound
**job.arguments.first**
# do something
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢 !!
据我所知,如果我们在这个事务中有任何代码,并且当它发生任何错误(保存!,...)时,整个代码将恢复,这里的问题是如果发生任何超时(机架超时= 12)在这个街区.
def create
ActiveRecord::Base.transaction do
// timeout happens
end
end
Run Code Online (Sandbox Code Playgroud)
发生时如何用事务回滚代码Rack::Timeout?