3

例外をキャッチする方法は知っていますが、コードの疑わしいセクションの後に「レスキュー」を配置するだけです。mysql2 gem を介して mysql にクエリを送信する多くの関数があり、それらの例外をキャッチしたい場合はどうでしょうか。あなたができることの1つは、それぞれに「レスキュー」ステートメントを入れることです。しかし、私はたった1つのレスキューステートメントでそれをやりたい. そのため、コードの最後に「レスキュー」を配置し、すべてのコードを「開始」と「終了」に配置しましたが、機能しませんでした。

これが私のコードです。ご覧のとおり、mysqlクエリに問題があり、「レスキュー」がファイルの終わりであるため、例外をキャッチしませんが、そのクエリの後に配置すると機能します。

    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

しかし、私のコードで見たように、うまくいきませんでした。

更新:ここで同様の質問を見つけましたが、答えはないようです :| 多分これは一種のルビーの弱点です。

4

5 に答える 5

4

エラーを確認したい場合は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
于 2013-03-06T23:55:53.480 に答える
2

$! の最後の例外にアクセスできる at_exit ハンドラーを使用できます。

お気に入り

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

例外を「発生するとすぐに」(キャッチされた後ではなく)キャッチしたい場合は、Rubyの「デバッグモード」(発生時にメッセージをコンソールに出力する)またはruby-debugを使用できます 方法はありますか例外で Ruby デバッガーを起動しますか?

于 2013-03-07T00:15:53.353 に答える
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

すべてのエラー クラスのリスト:

例外
 NoMemoryError
 スクリプト エラー
   LoadError
   NotImplementedError
   構文エラー
 SignalException
   割り込み
 標準エラー
   ArgumentError
   IOエラー
     EOFエラー
   インデックスエラー
   LocalJumpError
   NameError
     NoMethodError
   範囲エラー
     FloatDomainError
   正規表現エラー
   ランタイムエラー
   セキュリティエラー
   SystemCallError
   SystemStackError
   スレッドエラー
   TypeError
   ZeroDivisionError
 システム終了
 致命的
于 2013-03-07T00:08:00.900 に答える
0

クラスに at_exit メソッドを追加しようとしましたか? これにより、ruby の終了時に何かを実行できるようになります。この記事のように。

ルビー at_exit

また

Ruby 2.0 API ドキュメントから

ただし、例外から巧妙に救出することに注意してください。

失敗するはずのコードが失敗しない理由を突き止めようとすると、後々 (または別の開発者がそうするかもしれません) 頭を悩ませることになるでしょう。コードがここで失敗したことを示す明るい光沢のあるサインで大規模に失敗することを好みます! へへ。

幸運を!

于 2013-03-07T00:17:59.830 に答える
0

すべてのコードを次のようにラップするだけです:

begin

   #yourcode
   #as much as you want
rescue 

end 
于 2013-03-06T23:50:36.557 に答える