📜  红宝石 |异常处理

📅  最后修改于: 2022-05-13 01:54:46.163000             🧑  作者: Mango

红宝石 |异常处理

在 Ruby 中,异常处理是一个描述处理程序中引发的错误的方法的过程。这里,错误是指在程序执行期间(即在运行时)发生的不希望的或意外的事件,它破坏了程序指令的正常流程。所以这些类型的错误由救援块处理。 Ruby 还为异常提供了一个单独的类,称为Exception 类,它包含不同类型的方法。
引发异常的代码包含在开始/结束块之间,因此您可以使用救援子句来处理此类异常。

句法:

begin
    raise
      # block where exception raise

    rescue
      # block where exception rescue
end

例子:

# Ruby program to create the user 
# defined exception and handling it
   
# defining a method
def raise_and_rescue     
  begin
         
    puts 'This is Before Exception Arise!'
         
    # using raise to create an exception  
    raise 'Exception Created!'
   
    puts 'After Exception' 
   
  # using Rescue method
  rescue    
    puts 'Finally Saved!'    
     
end    
   
puts 'Outside from Begin Block!'    
   
end    
   
# calling method
raise_and_rescue   

输出:

This is Before Exception Arise!
Finally Saved!
Outside from Begin Block!

说明:在上述程序中,在开始块(raise block)中引发了一个异常,中断了程序的执行流程。要克服这种情况,请使用救援块来处理引发的异常。使用救援块时,它会处理异常并继续执行程序。

注意:可以在同一个程序中使用多个救援子句,这意味着如果第一个救援子句没有处理异常,那么另一个救援子句肯定会处理该异常。如果没有匹配的救援子句,或者如果在开始/结束块之外发生异常,那么 Ruby 会向上移动到堆栈并在调用者中查找异常处理程序。

Exceptions 中使用的语句是:

  1. retry 语句:该语句用于捕获异常后从头开始再次执行救援块。

    句法:

    begin
        # block where exception raise
    
    rescue
        # block where an exception is captured
    
    retry
    
        # this statement restarts the rescue
        # block from the beginning
    end
    

    例子:

    # Ruby program to illustrate 
    # use of retry statement
        
      begin
             
        # using raise to create an exception  
        raise 'Exception Created!'
       
        puts 'After Exception' 
       
      # using Rescue method
      rescue    
        puts 'Finally Saved!'
        
    # using retry statement  
    retry
    end    
    

    输出:

    Finally Saved!
    Finally Saved!
    Finally Saved!
    Finally Saved!
    Finally Saved!
    Finally Saved!
    .
    .
    .
    .
    

    注意:使用重试语句时要小心,因为它可能导致无限循环。

  2. raise 语句:该语句用于引发异常。

    句法:

    raise

    此语法用于重新引发当前异常。它通常由异常处理程序使用,其中异常在传递之前被中断。

    raise "Error Message"

    此语法用于创建 RuntimeError 异常并引发调用堆栈。

    raise ExceptionType, "Error Message"

    在此语法中,第一个参数用于创建异常,然后在第二个参数中设置消息。

    raise ExceptionType, "Error Message" condition

    在此语法中,第一个参数用于创建异常,然后在第二个参数中设置消息。您还可以设置条件语句来引发异常。

    例子:

    # Ruby program to illustrate 
    # use of raise statement
      
    begin
             
        puts 'This is Before Exception Arise!'
             
           # using raise to create an exception  
           raise 'Exception Created!'
       
        puts 'After Exception' 
    end
    

    输出:

    This is Before Exception Arise!
    Exception Created!
    
  3. ensure 语句:该语句确保所需的指令将在代码末尾执行,无论异常引发或引发的异常被抢救,还是程序因未捕获的异常而终止。这个块总是给出输出。该块放置在救援块上。

    句法:

    begin
         # exception raise
    
    rescue
        # exception rescue
    
    ensure
        # this block always executes
    end
    

    例子:

    # Ruby program to illustrate 
    # use of ensure statement
      
      begin
             
        # using raise to create an exception  
        raise 'Exception Created!'
       
        puts 'After Exception' 
       
      # using Rescue statement
      rescue    
        puts 'Finally Saved!'
        
    # using ensure statement  
    ensure
       puts 'ensure block execute'
    end    
    

    输出:

    Finally Saved!
    ensure block execute
    
  4. else 语句:此语句存在于救援块和确保块之间。此块仅在未引发异常时执行。

    句法:

    begin
      rescue
        # exception rescue
      
      else
        # this block executes when no exception raise
    
      ensure
        # this block always executes
    end
    

    例子:

    # Ruby program to illustrate 
    # use of else statement
      
     begin
             
        # using raise to create an exception  
        # raise 'Exception Created!'
       
        puts 'no Exception raise' 
      
        # using Rescue method
        rescue    
            puts 'Finally Saved!'
      
       #  using else statement
       else
            puts 'Else block execute because of no exception raise'
           
       # using ensure statement  
       ensure
          puts 'ensure block execute'
    end    
    

    输出:

    no Exception raise
    Else block execute because of no exception raise
    ensure block execute
    

    异常处理中的捕获和抛出

    在 Ruby 中,catch 和 throw 块是用于错误处理的轻量级机制,用于在程序中没有额外的工作可用时从异常中跳转。
    catch 块用于从嵌套块中跳出,并用名称标记该块。该块正常工作,直到遇到 throw 块。 catch 和 throw 方法比 raise 和 rescue 方法工作得更快。当遇到 throw 语句时,Ruby 将检查调用堆栈中带有相关符号的 catch 语句。 throw 语句从不执行并且总是返回 nil。

    句法:

    throw :label_name
        # this block will not be executed
    
    catch :label_name do
        # matching catch will be executed when the throw block encounter
    end
    

    您还可以在 catch 和 throw 语句中应用条件,如下所示:

    throw :label_name condition
         # this block will not be executed
    
    catch :label_name do
         # matching catch will be executed when the throw block encounter
    end
    

    例子:

    # Ruby program to illustrate 
    # use of catch and throw statement
      
    # defining a  method 
    def catch_and_throw(value)
      
      puts value
      a = readline.chomp
      
      # using throw statement
      throw :value_e if a == "!"
      return a
      
    end
      
    # using catch statement
    catch :value_e do
      
    # enter number
      number = catch_and_throw("Enter Number: ")
    end
    

    输入:

    Enter Number: 1
    

    输出:

    1
    

    输入:

    Enter Number: !
    

    输出:

    nil
    

    说明:在上面的示例中,catch_and_throw 方法用于打印在 catch 语句中输入的值。如果用户输入一个数字,那么它将打印数字,但如果用户输入!,那么它会给你 nil。因为 throw 语句实际上从未执行过。