gpt4 book ai didi

ruby - 处理 ruby​​ 中的默认异常

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:28 27 4
gpt4 key购买 nike

如何实现异常的默认行为? begin rescue else 不起作用(我认为应该如此)。

而且,else在场景中不是没有意义吗?在未引发异常时必须运行的任何代码都在 begin-rescue block 之间运行。

顺便说一句,我有以下解决方法,但我对此并不满意。

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

最佳答案

首先,你真的不应该继承Exception .它是所有 Ruby 异常的父类(super class),包括NoMemoryError。 , SyntaxError , Interrupt , SystemExit ;所有这些你通常不需要拯救。不鼓励这样做,无论是有意还是无意,因为它会阻止程序正常退出,即使它被用户中断也是如此。它还可以隐藏或产生一些非常隐蔽的错误。

你想要子类化的是StandardError ,这是我们在日常编程中看到的大多数 Ruby 错误的父类(super class)。如果您不指定一个类,该类也是将被rescued 的类:

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

关于ruby - 处理 ruby​​ 中的默认异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17503410/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com