相关疑难解决方法(0)

这是默默忽略Ruby异常的最短路径

我正在寻找这样的东西:

raise Exception rescue nil
Run Code Online (Sandbox Code Playgroud)

但我发现的最短路径是:

begin
  raise Exception
rescue Exception
end
Run Code Online (Sandbox Code Playgroud)

ruby exception-handling

24
推荐指数
3
解决办法
2万
查看次数

如何处理不知道Ruby中的库方法可以引发什么异常?

这是一个广泛的问题,但在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通过查看代码和测试了解到的内容?

(我还编辑了这个例子,以澄清它是我正在解析的服务器的响应.)

ruby exception-handling exception rescue

20
推荐指数
1
解决办法
9353
查看次数

如何在执行rake db:setup之前检查rails中是否存在数据库

如何在执行rake db:setup之前检查数据库是否存在于rails中?

我想在db:create完成之前检查数据库是否已经存在.到目前为止,我还没有在rails中看到过具体的方法,但我知道这可以使用mysql脚本完成

ruby-on-rails ruby-on-rails-3

19
推荐指数
6
解决办法
1万
查看次数

从Mysql2抢救::错误

我有一个简单的问题.我有一个连接表,其索引确保(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中解救出来.

谢谢,

ruby-on-rails exception mysql2

18
推荐指数
1
解决办法
1万
查看次数

RSpec重试抛出异常然后返回值

我有一个重试块

 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,但我不知道如何做第一次抛出异常并返回第二次.

ruby rspec ruby-on-rails

18
推荐指数
3
解决办法
9246
查看次数

Rails异常处理

如何将模型代码中发生的错误消息发送回视图.我的意思是.我有一个

begin
       Some code
rescue
       Exception Handling
end
Run Code Online (Sandbox Code Playgroud)

现在出现错误,在救援中,我想将一条消息发送回控制器,以便它在视图中显示.我是否必须使用一个变量,该变量必须包含一个请求中出现的大量错误消息,将它们连接起来并将其发送回控制器,以便我可以在视图中显示它?Rails已经显示一些错误消息,如字段不能为空.我问的是其他异常,它们出现在模型代码中的函数中.

exception-handling ruby-on-rails

16
推荐指数
4
解决办法
3万
查看次数

Ruby拯救除MyException之外的所有异常

在Ruby中,除了指定的异常之外,是否可以挽救所有异常?

ruby exception-handling

16
推荐指数
2
解决办法
6084
查看次数

如何在Nokogiri中处理404未找到的错误

我正在使用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)

ruby nokogiri http-status-code-404

9
推荐指数
1
解决办法
7669
查看次数

如何在ActiveJob rescue中访问执行参数

我想知道如何在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)

谢谢 !!

ruby ruby-on-rails sidekiq ruby-on-rails-4 rails-activejob

9
推荐指数
2
解决办法
3362
查看次数

具有事务块轨的TimeOut

据我所知,如果我们在这个事务中有任何代码,并且当它发生任何错误(保存!,...)时,整个代码将恢复,这里的问题是如果发生任何超时(机架超时= 12)在这个街区.

def create
  ActiveRecord::Base.transaction do
   // timeout happens
  end
end
Run Code Online (Sandbox Code Playgroud)

发生时如何用事务回滚代码Rack::Timeout

ruby transactions ruby-on-rails heroku

9
推荐指数
1
解决办法
580
查看次数