2013-07-06 51 views
1

如何为异常实现默认行为? begin rescue else不起作用(我认为应该)。在ruby中处理默认异常

而且,在场景中是不是else毫无意义?在没有异常发生时必须运行的任何代码都会在begin-rescue块之间运行。

顺便说一句,我有以下解决方法,但我不满意它。所有的

class MyException < Exception 
end 

class YourException < Exception 
end 

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue Exception => e 
    case e.message 
    when /MyException/ 
    puts "MyException Caught" 
    else 
    puts "Default Exception Caught" 
    end 
end 
+0

应该做到以下几点:抢救MyException,然后救援异常(不知道为什么我没有这样做过。:() – oozzal

回答

5

首先,你真的应该不继承Exception。它是所有超级红宝石的例外,包括NoMemoryError,SyntaxError,Interrupt,SystemExit;所有这些你通常不需要从中解救出来。这样做,无论是意外还是故意,都是不鼓励的,因为它可以防止程序正常退出,即使它被用户中断。它也可以隐藏或产生一些相当晦涩的错误。

你想要的子类是StandardError,它是我们在日常编程中看到的大多数Ruby错误的超类。这个类也是一个这将是rescue d,你应该不指定一个:

begin 
    object.do_something! 
rescue => error # will rescue StandardError and all subclasses 
    $stderr.puts error.message 
end 

我相信这是“默认行为”,你正在寻找。您可以处理一个特定的错误,那么所有其他错误一般:

class CustomApplicationError < StandardError 
end 

begin 
    object.do_something! 
rescue CustomApplicationError => error 
    recover_from error 
rescue => error 
    log.error error.message 
    raise 
end 

else条款是不是在错误处理毫无意义。它会执行嵌套代码,当且仅当没有异常被提出时,与ensure子句不同,它将执行代码。它允许你处理成功的情况。

begin 
    object.do_something! 
rescue => error 
    log.error error.message 
else 
    log.info 'Everything went smoothly' 
end 
+0

else子句对我来说没有多大意义,因为我被卡住了如何处理默认的异常情况,只要我得到它,其他的是有意义的。谢谢你的回应。:) – oozzal

+0

想通了。你的第二块代码是有意义的。不是为了营救“例外”,而是为其他例外使用救援。谢谢:) – oozzal

1

首先,我不明白你为什么用错误信息进行病例调整。为什么不通过他们的班级与错误呢?然后,它会是这样的:

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue Exception => e 
    case e 
    when MyException 
    puts "MyException Caught" 
    else 
    puts "Default Exception Caught" 
    end 
end 

第二,如上所述并不是直接的方法。做正确的方法是:

begin 
    raise MyException if 2 > 50 
    raise YourException if 1 < 90 
rescue MyException 
    puts "MyException Caught" 
rescue Exception 
    puts "Default Exception Caught" 
end 

如果YourException是的StandardError一个子类,那么它可以被rescue没有指定异常类抓获。

+0

是的,这是正确的答案,我后来发现它(如评论中所述)。不过谢谢。 :) – oozzal