在ruby中'raise'语句之后如何使脚本继续运行?

Sys*_*RJR 1 ruby

我正在检查日志文件中是否有任何错误消息.如果在日志文件中找到错误消息,那么我使用'raise'语句来报告创建.然而,ruby在执行'raise'语句后停止运行,即使我使用'rescue'.我希望脚本在'raise'语句后继续检查下一个日志文件是否有错误,但不确定如何.任何帮助,将不胜感激!

        logs_all = s.sudo "egrep -i '#{error_message}' #{log_file}"
        logs_all.each do |hostname, logs|
           unless logs.empty?
            puts line, "Unhappy logs on #{hostname}", line, logs
            happy = false
           end

           begin

            raise "Unhappy logs found! in #{log_file}" unless happy

           rescue raise => error
            puts error.message
           end


        end
Run Code Online (Sandbox Code Playgroud)

exb*_*ary 5

您的救援声明看起来不正确:

rescue raise => error
Run Code Online (Sandbox Code Playgroud)

应该:

rescue => error
Run Code Online (Sandbox Code Playgroud)

这相当于:

rescue StandardError => error
Run Code Online (Sandbox Code Playgroud)

如果你拯救一个例外并且不再重新提起它,那么ruby会继续.您可以通过以下方式轻松验证:

3.times do |i|
  begin
    raise "Raised from iteration #{i}"
  rescue => e
    puts e
  end
end
Run Code Online (Sandbox Code Playgroud)

你会看到打印出三行输出.

但是,作为一般做法,除非您要在运行时执行某些操作以纠正问题,否则应避免挽救异常.抢救而不是重新抛出异常可以隐藏代码中的问题.

更一般地说,请遵循上面的 Sergio 建议,不要将异常用作控制流程.

进一步阅读