Ruby 捕捉和抛出异常
异常 是Exception类的一个对象或该类的一个子对象。当程序在执行过程中达到一个没有定义的状态时,就会发生异常。现在程序不知道该怎么做,所以它引发了一个异常。这可以由Ruby自动完成,也可以手动完成。 Catch和Throw 是类似于提高和救援的关键字,在Ruby中也可以用catch和throw关键字来处理异常。Throw关键字会产生一个异常,每当它被满足时,程序控制权就会转到catch语句。
语法
catch :lable_name do
# matching catch will be executed when the throw block encounter
throw :lable_name condition
# this block will not be executed
end
catch块被用来从嵌套块中跳出,该块被标上了一个名字。这个块在遇到抛出块之前一直正常工作,这就是为什么使用catch和throw而不是raise或repair。
例子 #1 :
# Ruby Program of Catch and Throw Exception
gfg = catch(:divide) do
# a code block of catch similar to begin
number = rand(2)
throw :divide if number == 0
number # set gfg = number if
# no exception is thrown
end
puts gfg
输出:
在上面的例子中,如果数字是0,那么就会抛出异常:divide,它没有向catch语句返回任何东西,结果是””被设置为gfg。
例子#2: 用默认值抛出。
在上面的例子中,当异常被抛出时,变量gfg的值被设置为””。我们可以通过向throw关键字传递默认参数来改变这一情况。
# Ruby Program of Catch and Throw Exception
gfg = catch(:divide) do
# a code block of catch similar to begin
number = rand(2)
throw :divide, 10 if number == 0
number # set gfg = number if
# no exception is thrown
end
puts gfg
输出:
10
在上面的例子中,如果数字是0,我们得到10。如果数字是1,我们得到1。
例子3: 嵌套结构体的例子,这里我们将看到我们如何跳出嵌套结构体。
# Ruby Program of Catch and Throw Exception
gfg = catch(:divide) do
# a code block of catch similar to begin
100.times do
100.times do
100.times do
number = rand(10000)
# comes out of all of the loops
# and goes to catch statement
throw :divide, 10 if number == 0
end
end
end
number # set gfg = number if
# no exception is thrown
end
puts gfg
输出:
10
如果数字是0,甚至在循环中的一次,我们得到10,否则我们得到的数字。