在Ruby中,不同的救援声明有什么区别?

时间:2015-05-11 06:24:30

标签: ruby-on-rails ruby

在Ruby中有什么区别

def run
 begin
   raise SomeError.new
 rescue SomeError
   handle
 end    
end

def run
  raise SomeError.new
rescue SomeError
  handle
end

7 个答案:

答案 0 :(得分:1)

相同,没有区别。第二个是第一个的简写。

答案 1 :(得分:1)

示例:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

此处,defbegin声明:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

基本上没有区别。在上面的代码方法中,def可以作为begin语句:

正如spickermann评论你也可以使用else只有在没有预期的情况下才能运行

begin  
  # -  
rescue OneTypeOfException  
  # -  
rescue AnotherTypeOfException  
  # -  
else  
  # Other exceptions  
end

对于rescue块中的每个begin子句,Ruby依次将引发的Exception与每个参数进行比较。如果rescue子句中指定的异常与当前抛出的异常的类型相同,或者是该异常的超类,则匹配将成功。如果begin语句正文中的代码运行完成而没有异常,则执行 else 子句中的代码。如果发生异常,则显然不会执行else子句。

请参阅此内容以获取更多理解:http://rubylearning.com/satishtalim/ruby_exceptions.html

答案 2 :(得分:1)

您提出的2个代码之间没有区别。您唯一希望使用$("#menu1 li a").click(function (e) { $(this).next("ul").toggle("slow"); e.preventDefault(); }); $("#menu2 li a").click(function (a) { $(this).next("ul").toggle("slow"); a.preventDefault(); }); 的方法是,如果您只想要拯救某部分代码。

begin

它还提醒您不要只使用def rescue_me no_rescue = 1 + 1 begin no_rescue / 0 rescue # handle end end 。您应该知道要拯救的异常。在上面的示例中,您要抢救rescue

答案 3 :(得分:1)

它们是等效的,即使它们不生成相同的代码。大多数更改只是重新编号,但第一个中有一些额外的指令(在此统一差异中由-标记)。虽然它们做得不多(主要是trace和标签)。

 ["YARVInstructionSequence/SimpleDataFormat", 2, 2, 1,
  {:arg_size=>0, :local_size=>1, :stack_max=>4},
  "<compiled>", "<compiled>", nil, 1, :top, [], {}, [],
  [1,
   [:trace, 1],
   [:putspecialobject, 1],
   [:putspecialobject, 2],
   [:putobject, :run],
   [:putiseq,
    ["YARVInstructionSequence/SimpleDataFormat", 2, 2, 1,
     {:arg_size=>0, :local_size=>1, :stack_max=>2},
     "run", "<compiled>", nil, 1, :method, [], {},
     [[:rescue,
       ["YARVInstructionSequence/SimpleDataFormat", 2, 2, 1,
        {:arg_size=>0, :local_size=>2, :stack_max=>2},
        "rescue in run", "<compiled>", nil, 2, :rescue, [:"\#$!"], {}, [],
-       [4,
-        [:trace, 1],
+       [3,
         [:getlocal_OP__WC__0, 2],
-        [:getinlinecache, :label_11, 0],
+        [:getinlinecache, :label_9, 0],
         [:getconstant, :SomeError],
         [:setinlinecache, 0],
-        :label_11,
+        :label_9,
         [:checkmatch, 3],
-        [:branchunless, :label_21],
-        5,
+        [:branchunless, :label_19],
+        4,
         [:trace, 1],
         [:putself],
         [:opt_send_without_block, {:mid=>:handle, :flag=>280, :blockptr=>nil, :orig_argc=>0}],
-        4,
+        3,
         [:leave],
-        :label_21,
+        :label_19,
         0,
         [:getlocal_OP__WC__0, 2],
         [:throw, 0]]],
-      :label_4,
-      :label_18,
-      :label_19,
+      :label_2,
+      :label_16,
+      :label_17,
       0],
-     [:retry, nil, :label_18, :label_19, :label_4, 0]],
+     [:retry, nil, :label_16, :label_17, :label_2, 0]],
     [1,
      [:trace, 8],
+     :label_2,
      2,
      [:trace, 1],
-     :label_4,
-     3,
-     [:trace, 1],
      [:putself],
-     [:getinlinecache, :label_14, 0],
+     [:getinlinecache, :label_12, 0],
      [:getconstant, :SomeError],
      [:setinlinecache, 0],
-     :label_14,
+     :label_12,
      [:opt_send_without_block, {:mid=>:new, :flag=>256, :blockptr=>nil, :orig_argc=>0}],
      [:opt_send_without_block, {:mid=>:raise, :flag=>264, :blockptr=>nil, :orig_argc=>1}],
-     :label_18,
-     2,
+     :label_16,
      [:nop],
-     :label_19,
-     7,
+     :label_17,
+     5,
      [:trace, 16],
-     3,
+     2,
      [:leave]]]],
   [:opt_send_without_block,
    {:mid=>:"core#define_method", :flag=>256, :blockptr=>nil, :orig_argc=>3}],
   [:leave]]]

答案 4 :(得分:0)

在这种特定情况下,除了选项1看起来更加丑陋之外没有区别,

救援适用于代码上下文,方法是设置begin...end您创建适用rescue的代码上下文,

第二个选项有效是因为方法def...end也是代码上下文

答案 5 :(得分:0)

两者都是不同语法的相同内容。后来用于挽救整个方法而不是代码块。

答案 6 :(得分:0)

IT看起来都是一样的。在第二个代码中,它为您提供了更多代码。