преобразование строки $! - PullRequest
0 голосов
/ 05 мая 2011

Я пытаюсь обработать исключение, вызванное следующим кодом:

begin
  reader = CSV.open(ARGV[0],col_sep=";") 
rescue
  puts "exception: " + $!
  exit
end

К сожалению, я не могу правильно отобразить сообщение, Ruby не интерпретирует $!как строка, и ни один из них не может правильно ее преобразовать:

$ ruby.exe fixcsv.rb csvfile
fixcsv.rb:11:in `+': can't convert ArgumentError into String (TypeError)
        from fixcsv.rb:11:in `rescue in <main>'
        from fixcsv.rb:8:in `<main>'

Я действительно не могу понять, почему это происходит;В следующем уроке показан похожий код, который, очевидно, учитывает правильное преобразование строки $ !: http://ruby.activeventure.com/programmingruby/book/tut_exceptions.html

Это имеет какое-либо отношение к тому факту, что я явно не устанавливал класс исключения?

Ответы [ 3 ]

3 голосов
/ 05 мая 2011

Хотя я бы порекомендовал сделать то, что сделал fl00r (Exception => e), вы все равно можете использовать $!, если действительно хотите:

begin
  reader = CSV.open(ARGV[0],col_sep=";") 
rescue
  puts "exception: " + $!.message
  exit
end
3 голосов
/ 05 мая 2011
begin
  reader = CSV.open(ARGV[0],col_sep=";") 
rescue Exception => e  
  puts "exception: #{e.message}"
end
2 голосов
/ 06 мая 2011

Вам даже не нужно добавлять .message к e, из примера @ fl00r:

begin
  reader = CSV.open(ARGV[0],col_sep=";") 
rescue Exception => e  
  puts "exception: #{e}"
end

В результате Ruby вызывает .to_s в исключении e. Исключения реализуют to_s, они просто не реализуют to_str, что "exception: " + $! пытался сделать.

Разница между to_s и to_str в том, что первое означает «Вы можете изменить меня в строку, но я совсем не похож на строку», тогда как второе означает «Не только вы можете изменить меня в строку, но я очень похож на строку ". Обсуждение Йорга Миттага о to_s против to_str стоит прочитать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...