草庐IT

raise-line

全部标签

ruby 事件机器 + AMQP : Ensuring specific async calls happen before raising exceptions

我们正在用Ruby构建一个支持AMQP的消息传递系统。但是,我们在错误处理方面遇到了问题。我们维护一个异常白名单,这是安全的,并且RabbitMQ中的消息可以不被确认并由另一个工作人员重试。然而,对于未知或不可预见的错误,我们假设无论工作人员尝试消息多少次,同样的失败总是会发生。这意味着,当出现未知错误时,我们需要捕获它,将其记录在某个地方(目前是MySQL),然后向RabbitMQ发送一个ACK调用以从队列中删除消息。目前一切都是使用amqpgem构建的,它是用EventMachine触发的。这会导致问题,因为调用#ack方法,并不意味着ACK由于gem的异步行为已发送到Rabbit

ruby - Thread#raise 在 MRI Ruby 1.9/2.0 中安全吗?

所以有一篇关于Thread#raise、Thread#kill和扩展超时(http://headius.blogspot.com/2008/02/rubys-threadraise-threadkill-timeoutrb.html)的不安全性的旧博客文章。出于大致相同的原因(http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html),Java很久以前就弃用了它的等效方法。博文很老了。Thread.raise的现代实现是否安全?如果是这样,是否有文件/promise来证明/证明

ruby - 如何使用 assert_raise 来测试 Ruby 中的错误?

我有程序factorial.rb和test_factorial.rb。前者看起来像这样:deffactorial(n)(1..n).inject(:*)||1endtest_factorial看起来像这样:deftest_numberassert_equal6,factorial(3),"3!shouldbe6"enddeftest_zeroassert_equal1,factorial(0),"0!shouldbe1"end我需要向测试文件添加另一种方法test_negative以确认当阶乘为负时引发错误。我查看了文档,但仍然不明白我应该做什么。我是否必须在assert_raise之

ruby - 为什么我不能使 "OpenSSL with Ruby"和 "Command line OpenSSL"互操作?

在尝试设置可互操作的加密系统时,我在简单的“概念验证”期间遇到了一个奇怪的情况。我用Ruby编写了以下代码:从我的文件系统上的虚拟文本文件创建一个加密文件解密加密文件与原文件对比,是否相同代码如下:require'openssl'require'base64'#Readthedummyfiledata=File.read("test.txt")#Createanencryptercipher=OpenSSL::Cipher::AES.new(256,:CBC)cipher.encryptkey="somethingreallyreallycomplicated"cipher.key=k

ruby - 在 Ruby on Rails 中计算/存储 line_item 总数的最佳方法是什么?

我有line_items和unit_price和quantity属性(以及其他)。在RubyonRails中对此进行建模的最佳方法是什么?现在,我的LineItem模型中的许多函数都遵循这种模式:deftotal_priceunit_price*quantityend这行得通,但我想知道:这种方法是否有用,或者当有100万用户同时使用它时,它是否会使我的应用崩溃?另一种方法是将total_price存储为数据库字段,每次保存后都会更新类似这样的内容:after_save:update_total。不过,我不是冗余数据库列的忠实拥护者。我想将它们保持在最低限度。这样做的专业方法是什么?

ruby - 一个 stub 和_raise 异常怎么可能只有一次?

我知道有一种方法可以让stub像这样返回多个不同的值:subject.stub(:method_call.and_return(1,2,3)但我希望这样的事情是可能的:subject.stub(:method_call).and_raise(Exception).oncesubject.stub(:method_call).and_return(1)但我还没有找到一种优雅的方式让stub仅在第一次调用时引发异常。有什么建议吗? 最佳答案 我知道的唯一方法是使用这样的计数器变量:counter=0times=2TestModel.an

Ruby:如何使用 assert_nothing_raised?

assert_nothing_raiseddo@board.make_move(0,0,Board::HUMAN)end文档说:Passesifblockdoesnotthrowanything.Example:assert_nothing_throwndo[1,2].uniqend我的make_move方法:defmake_move(x,y,player)returnfalseend我得到错误:test_can_make_valid_move_in_the_first_row(BoardTest):ArgumentError:wrongnumberofarguments(1for2)

ruby - 就地进度输出到控制台 : How to empty the current line

我有一个Ruby脚本,它使用回车符在同一行输出进度消息,如下所示:print"\r#{file_name}processed."例如,输出从'file001.html'processed.更改为'file002.html'。处理等等,直到脚本完成。我想用Done.替换最后的进度消息,但我不能只写print"\rDone."因为那段代码输出像这样:Done.99.htmlprocessed.我想我必须清空最后一条进度消息之后的行,然后打印Done.。我该怎么做? 最佳答案 你需要发送terminfo对应的字节序列使用\r后的变量clr

ruby-on-rails - ActionMailer raise_delivery_errors 在生产中应该是真还是假?

如果为真,它将向用户发送一条错误消息。如果虚假交付错误不会被注意到。推荐的处理方法是什么? 最佳答案 我们刚刚将一个应用程序投入生产,当我们尝试发送邮件时,我们的ISP的邮件服务器经常返回“451spoolbusy”错误。这两个答案都对我们不利:如果我们向用户返回一个错误,我们就把我们的基础架构问题传递给了他们;如果我们不这样做,他们就不会收到邀请/确认/通知/任何其他信息,而且没人知道为什么。相反,我们决定设置delayed_job,并始终通过它发送邮件;它会自动重试,我们可以(从数据库中的作业队列表中)看到消息是否正在堆积。(它

Ruby StringScanner 用于词法分析 : how to get the line number?

我正在使用StringScanner进行词法分析,如下所示:defnext@scanner.skip(/\s+/)value,kind=nil,nilTOKEN_DEF.each{|tok,regex|(kind=tok;break)if@scanner.scan(regex)}returnToken.new(kind,value,@line,@scanner.pos)end初步估计,这很好用,只是我不知道现在如何获取@line编号。我已经阅读了文档,begin_of_line在哪里?方法似乎合适,但我不知道如何使用它。 最佳答案