How to catch all exceptions as soon as they occur by just one rescue statement

I know how to catch the exceptions but what we do is to put "rescue" after a suspicious section of a code. what if you had a lot functions sending a query to mysql through mysql2 gem and you want to catch their exceptions. One thing you can do is to put a "rescue" statement in each of them. but i want to do that just by one rescue statement. So I put a "rescue" in end of code and put all of code in a "begin" and "end" but it didn't work.

Here is my code and as you see there is a problem in mysql query and just because of "rescue" being end of file, it doesn't catch the exception but when I put it after that query it works.

    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)

I'm not looking for something like:

begin
  # my code
rescue # this line is right after the code which is going to have problem and we catch it.

end

I'm looking for something like this:

begin
  # first method
  # second method
  # thrid method
  # rest of code and etc ...
  # now this is end of file: 
rescue
end

but as you saw in my code, it didn't work.

UPDATE: I found a similar question here and it seems there will be no answer :| maybe this is a sort of ruby Weakness.


if you want to see ANY error just use e for example

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

In order to catch every exception you'd need to wrap each method call with a begin rescue end . When an exception is raised it bails out of the execution so it wouldn't hit the next methods.

To catch all errors I guess I'd do something like this. Keep in mind, this is ugly and I'd recommend for you NOT to do this, but... if you want to try, maybe try something like this:

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

After a quick search I've found: (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

You could use an at_exit handler, which has access to the last exception in $!

like

 at_exit {
   puts "the exception that killed us is", $! 
 }

If you want to catch Exceptions "as soon as they occur" (not after they're caught) you could use ruby's "debug mode" (which outputs messages when they occur to the console) or ruby-debug see Is there any way to start the Ruby debugger on exception?


只需将所有代码包装在:

begin

   #yourcode
   #as much as you want
rescue 

end 
链接地址: http://www.djcxy.com/p/25876.html

上一篇: 针对检查异常的情况

下一篇: 如何通过一条救援声明尽快捕获所有异常