ruby-on-rails ruby -使脚本在异常后继续到开始中的下一条语句,并使用rescue完成

voase2hg  于 2023-01-22  发布在  Ruby
关注(0)|答案(3)|浏览(177)

把我的代码看作

begin
  aa = 20
  bb = 0
  puts 'before exception'
  c = aa / bb
  puts 'after exception'
rescue
  puts 'in rescue'
end

它给出的输出为

before exception
in rescue

如果我想打印'后异常'以及。我需要怎么做呢?
我需要在异常引发后继续下一条语句。请帮助我。
编辑:我刚刚提到了上面的一个示例代码。考虑一下,我可能不知道哪里会发生什么异常,它可能会出现在脚本的任何地方,在执行完rescue之后,我需要回到开始中的下一行并处理它。在ruby中有什么方法可以处理这个问题吗?

8e2ybdfx

8e2ybdfx1#

你不能进入开始块。但是如果任何代码需要在异常后运行,请使用ensure块。

begin
  aa = 20
  bb = 0
  puts 'before exception'
  c = aa / bb
rescue
  puts 'in rescue'
ensure
  puts 'after exception'
end
zzoitvuj

zzoitvuj2#

下面是解决这种自定义异常情况的方法,或者您需要将代码块划分为多个部分,并为您觉得可能引发异常的代码块创建一个开始结束代码块。

class Exception
      attr_accessor :continuation
      def ignore
        continuation.call
      end
    end

    require 'continuation' # Ruby 1.9
    module RaiseWithIgnore
      def raise(*args)
        callcc do |continuation|
          begin
            super
          rescue Exception => e
            e.continuation = continuation
            super(e)
          end
        end
      end
    end

    class Object
      include RaiseWithIgnore
    end

    def mj
      puts 'before exception'
      raise 'll'
      puts 'after exception'
    end

    begin
      mj
      rescue => e
        puts 'in rescue'
        e.ignore 
      end

希望这能有所帮助。来源:http://avdi.org/talks/rockymtnruby-2011/things-you-didnt-know-about-exceptions.html

htzpubme

htzpubme3#

这是一个非常好的问题,Ruby真的应该提供一种方法来忽略异常并继续到 * rescue块中的下一行 *。
看来唯一的选择是使用内联救援,这是不赞成作为一个不好的风格。

begin
  aa = 20
  bb = 0
  puts 'before exception'
  c = aa / bb rescue nil
  puts 'after exception'
end

相关问题