我知道如何捕获异常,但我们所做的是在代码的可疑部分之后放置“救援”。如果你有很多函数通过mysql2 gem向mysql发送查询并且想要捕获它们的异常,那该怎么办呢?你可以做的一件事就是在每一个中都加上一个“救援”声明。但我想通过一个救援声明来做到这一点。所以我在代码的末尾放了一个“救援”,并将所有代码放在“开始”和“结束”但是它没有用。
这是我的代码,正如你所看到的,mysql查询中存在一个问题,只是因为“rescue”是文件的结尾,它没有捕获异常,但是当我把它放在那个查询之后就可以了。
require 'mysql2'
require 'colored'
begin
def log(string)
p "["+string.cyan+"]"
end
def err
p "["+"FAIL".red+"]"
end
def done
p "["+"DONE".red+"]"
end
class SqlClient
def initialize()
log "SqlClient/initialize"
puts "Host: \n"
@host = gets.strip
puts "User: \n"
@user = gets.strip
puts "Pass: \n"
@pass = gets.strip
@client = Mysql2::Client.new(host: @host , username: @user , password: @pass)
end
def list_databases()
puts "We are listing your databases(not just projects) \n \n \n "
@client.query("ELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA").each do |row|
p row["SCHEMA_NAME"]
end
puts "\n \n \n"
end
end
rescue Mysql2::Error
err
abort
end
`query': You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'ELECT SCHEMA_NAME FROM
INFORMATION_SCHEMA.SCHEMATA' at line 1 (Mysql2::Error)
我不是在寻找类似的东西:
begin
# my code
rescue # this line is right after the code which is going to have problem and we catch it.
end
我正在寻找类似的东西:
begin
# first method
# second method
# thrid method
# rest of code and etc ...
# now this is end of file:
rescue
end
但正如您在我的代码中看到的那样,它无效。
更新:我发现了一个类似的问题here,似乎没有答案:也许这是一种红宝石的弱点。
答案 0 :(得分:4)
如果您想查看 ANY 错误,请使用e
例如
begin
# your call to a method of Mysql2 gem. for example:
client = Mysql2::Client.new(:host => "localhost", :username => "root", etc...)
rescue => e
puts e.message
puts e.backtrace.inspect
end
为了捕获每个异常,您需要使用begin
rescue
end
包装每个方法调用。当引发异常时,它会退出执行,因此它不会触及下一个方法。
为了捕捉所有错误,我想我会做这样的事情。请记住,这很难看,我建议您不这样做,但是......如果您想尝试,可以尝试这样的事情:
all_errors = []
# first method you call
begin
# some error might happen here
first_response = Mysql2::Client.new(:host => "localhost", :username => "root", etc...)
rescue => e
all_errors << e
end
# second method you call
begin
# some error might happen here
second_response = Mysql2::Client.new(:host => "localhost", :username => "root", etc...)
rescue => e
all_errors << e
end
puts all_errors.inspect
快速搜索后,我发现:(http://coderrr.wordpress.com/2008/11/07/the-simple-way-to-print-exceptions-in-ruby/)
# catch all exceptions (anything that derives from Exception)
begin
...
rescue Exception
puts $!, $@
end
答案 1 :(得分:2)
您可以使用at_exit处理程序,该处理程序可以访问$!
中的最后一个异常像
at_exit {
puts "the exception that killed us is", $!
}
如果您希望在发生例外情况时立即发现&#34;&#34; (不是在他们被抓住之后)你可以使用ruby&#34;调试模式&#34; (在控制台出现消息时输出消息)或ruby-debug参见Is there any way to start the Ruby debugger on exception?
答案 2 :(得分:0)
将所有代码包装在:
begin
#yourcode
#as much as you want
rescue
end
答案 3 :(得分:0)
似乎没有人注意到它,但是在没有类的情况下使用rescue
会捕获所有StandardError,而且还有更多。
如果您想要捕获所有例外
begin
# your code where you call SqlClient.new etc
rescue Exception => e
puts "error raised"
puts [e, e.backtrace].flatten.join("\n")
end
所有错误类的列表:
Exception NoMemoryError ScriptError LoadError NotImplementedError SyntaxError SignalException Interrupt StandardError ArgumentError IOError EOFError IndexError LocalJumpError NameError NoMethodError RangeError FloatDomainError RegexpError RuntimeError SecurityError SystemCallError SystemStackError ThreadError TypeError ZeroDivisionError SystemExit fatal
答案 4 :(得分:0)
您是否尝试在班级中添加at_exit方法?这将允许您在ruby退出时执行某些操作。喜欢这篇文章。
或
但要注意巧妙地从异常中拯救!
当你试图找出你的代码在失败时没有失败的原因时,你会开始将你的头发拉下来(或另一个开发者)。我更喜欢用一个明亮的闪亮标志大量失败,说代码在这里失败!呵呵。
祝你好运!