红宝石 |异常处理
在 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 中使用的语句是:
- 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! . . . .
注意:使用重试语句时要小心,因为它可能导致无限循环。
- 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!
- 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
- 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 语句实际上从未执行过。