异常和执行总是被联系在一起。如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的。
如果异常发生,则程序停止。异常用于处理各种类型的错误,这些错误可能在程序执行期间发生,所以要采取适当的行动,而不至于让程序完全停止。
Ruby 提供了一个完美的处理异常的机制。我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型。
语法
begin # - rescue OneTypeOfException # - rescue AnotherTypeOfException # - else # 其他异常ensure# 总是被执行end
从 begin 到 rescue 中的一切是受保护的。如果代码块执行期间发生了异常,控制会传到 rescue 和 end 之间的块。
对于 begin 块中的每个 rescue 子句,Ruby 把抛出的异常与每个参数进行轮流比较。如果 rescue 子句中命名的异常与当前抛出的异常类型相同,或者是该异常的父类,则匹配成功。
如果异常不匹配所有指定的错误类型,我们可以在所有的 rescue 子句后使用一个 else 子句。
实例
#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" endrescue file = STDINendprint file, "==", STDIN, "/n"
这将产生以下结果。您可以看到,STDIN 取代了 file ,因为打开失败。
#<IO:0xb7d16f84>==#<IO:0xb7d16f84>
使用 retry 语句
您可以使用 rescue 块捕获异常,然后使用 retry 语句从开头开始执行 begin 块。
语法
begin # 这段代码抛出的异常将被下面的 rescue 子句捕获rescue # 这个块将捕获所有类型的异常 retry # 这将把控制移到 begin 的开头end实例#!/usr/bin/ruby begin file = open("/unexistant_file") if file puts "File opened successfully" endrescue fname = "existant_file" retryend
以下是处理流程:
注意:如果被重新命名的文件不存在,本势力代码会无限尝试。所以异常处理时,谨慎使用 retry。
使用 raise 语句
您可以使用 raise 语句抛出异常。下面的方法在调用时抛出异常。它的第二个消息将被输出。
语法
raise OR raise "Error Message" OR raise ExceptionType, "Error Message" OR raise ExceptionType, "Error Message" condition
第一种形式简单地重新抛出当前异常(如果没有当前异常则抛出一个 RuntimeError)。这用在传入异常之前需要解释异常的异常处理程序中。
新闻热点
疑难解答