Неинициализированная постоянная ошибка при отлове исключения - PullRequest
0 голосов
/ 18 августа 2011

Мне нужно опубликовать статьи в Wordpress через XMLRPC и перехватить любые исключения:

connection = XMLRPC::Client.new('mysite.com', '/xmlrpc.php', 80)
  connection.call(
  'metaWeblog.newPost',
  1,
  'user',
  'password',
  post,
  true
)

Ошибка en:

C:/Ruby192/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:441:in `rescue in pull': #<NoMethodError: undefined method `[]' for nil:NilClass> (REXML::ParseException)
C:/Ruby192/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:341:in `pull'
C:/Ruby192/lib/ruby/1.9.1/rexml/parsers/streamparser.rb:16:in `parse'
C:/Ruby192/lib/ruby/1.9.1/rexml/document.rb:204:in `parse_stream'
C:/Ruby192/lib/ruby/1.9.1/xmlrpc/parser.rb:717:in `parse'
C:/Ruby192/lib/ruby/1.9.1/xmlrpc/parser.rb:460:in `parseMethodResponse'
C:/Ruby192/lib/ruby/1.9.1/xmlrpc/client.rb:421:in `call2'
C:/Ruby192/lib/ruby/1.9.1/xmlrpc/client.rb:410:in `call'

Я успешно поймал исключение с:

connection = XMLRPC::Client.new('mysite.com', '/xmlrpc.php', 80)
begin
  connection.call(
    'metaWeblog.newPost',
    1,
    'user',
    'password',
    post,
    true
  )
rescue REXML::ParseException
  puts "Skipping error"
end

С сообщением все в порядке, статья в Wordpress.

Далее мне нужно было поймать исключение о доступности сайта (когда сайт недоступен) Я пытался поймать исключение с помощью:

connection = XMLRPC::Client.new('notaccessibleSite.com', '/xmlrpc.php', 80)
begin
  connection.call(
    'metaWeblog.newPost',
    1,
    'user',
    'password',
    post,
    true
  )
rescue REXML::ParseException
  puts "Skipping error"
rescue
  puts "Others errors"
end

Но это не работает:

myscript.rb:47:in `rescue in makeRpc': uninitialized constant Object::REXML (NameError)
from myscript.rb:38:in `makeRpc'
from myscript.rb:62:in `block in postContent'
from myscript.rb:58:in `each'
from myscript.rb:58:in `postContent'
from myscript.rb:71:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'

Есть предложения?

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Вы пробовали require 'rexml/document'.Посмотрите документацию для rexml / document.rb .Для вас требуется 'rexml/rexml', а также 'rexml/parseexception'.

Следующие ошибки не выдают:

require "rexml/document"

begin
    doc = REXML::Document.new File.new('blah.txt')
rescue REXML::ParseException => msg
    puts "Failed: #{msg}"
end

Однако, если вы замените rexml/document на 'rexml/rexml', вы получите:

blah.rb:22:in `rescue in <main>': uninitialized constant REXML::ParseException (NameError)
    from abc.rb:20:in `<main>'

Обновление (на основе комментариев):

Если вы хотите проверить, что REXML::ParseException определено, будет работать что-то вроде следующего:

if defined?(REXML::ParseException) == 'constant' && REXML::ParseException.class == Class  
  puts "REXML::ParseException is defined"
else
  puts "REXML::ParseException is NOT defined" 
end
0 голосов
/ 18 августа 2011

Вы должны require 'rexml/rexml' раньше.

0 голосов
/ 18 августа 2011

Кажется, что он не может найти Object :: REXML, когда вы тестируете этот случай, возможно, rescue NameError спасет это.

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