2010-01-29 4 views
5

J'ai récemment découvert le Hanna RDoc template et je l'aime beaucoup plus que la valeur par défaut. Je veux l'utiliser dans mon projet, mais je ne veux pas non plus que mon projet l'exige.Récupérer de l'échec de require/load dans ruby ​​

Le seul changement que je devais faire à mon Rakefile pour obtenir le modèle hanna au travail était de changer

require 'rake/rdoctask' 

à

require 'hanna/rdoctask' 

Est-il possible d'essayer un besoin, et la capture/récupérer de l'erreur? J'ai remarqué load et require retourner un booléen dans RIR, donc je pensais que je pouvais le faire:

unless require 'hanna/rdoctask' 
    require 'rake/rdoctask' 
end 

Malheureusement, râteau avorté dès que require a échoué. Puis j'ai essayé:

begin 
    require 'hanna/rdoctask' 
rescue 
    require 'rake/rdoctask' 
end 

mais cela n'a pas fonctionné non plus.

Y at-il un moyen d'accomplir ce que je tente ici?

+0

Cette requête est une copie exacte de http://StackOverflow.Com/questions/2061528/ qui contient plusieurs réponses utiles. –

Répondre

4

Votre dernière option devrait fonctionner.

require 'rubygems' 
begin 
    require 'hanna/rdoctask' 
rescue LoadError 
    puts 'Hanna rdoc unavailable, falling back to rake' 
    require 'rake/rdoctask' 
end 

fonctionne sur ma machine, en cours d'exécution Ruby 1.8.7p248 avec le petit bijou "râteau" installé, mais pas le petit bijou "hanna". Êtes-vous sûr que vous avez des rubygems requis dans votre environnement, cependant? Si non, exiger 'rake/rdoctask' pourrait aussi échouer.

+0

require 'rubygems' est dans le rakefile, mais cela ne devrait pas avoir d'importance car j'ai la valeur rubygems dans RUBYOPT. – Herms

+0

Cela a fonctionné. Je ne sais pas pourquoi ma première tentative a échoué. – Herms

+2

Parce que vous n'avez pas sauvé 'LoadError', vous avez sauvé' StandardError' qui est la valeur par défaut si aucune exception n'est spécifiée. –

3

je remarqué la charge et exigent retourner un booléen dans irb

La valeur de retour de require vous indique si la bibliothèque était effectivement chargé: il est true si la bibliothèque a été chargée et false si la bibliothèque a été trouvé mais pas chargé car il avait déjà été chargé .

L'erreur est indiquée avec une exception LoadError.