2011-11-18 3 views
1

correspond pas à attendre que j'ai un bloc de sauvetage qui vérifie l'exception correcte jeté ou non comme suit:Ruby Exception.to_s chaîne ne

rescue Exception 
     if $!.to_s() != "myException" 
     Err("Unexpected error :" + $!) 
     end 
     else 
     Err("No error") 

Mon $!.to_s() contient de grandes chaînes comme suit quand je puts aime:

puts $!.to_s() 

sortie supérieure puts avant if déclaration est:

myException \n 
th sdfsj dsjhf sdfj \n 
asdj jkds fdf j 

Donc dans if déclaration Je veux comparer la première ligne de la sortie de $!.to_s() avec une chaîne entre guillemets.

Des suggestions pour résoudre ce problème?

+3

"Exception correcte levée"? Vous n'êtes pas en train de coder par exception, n'est-ce pas? – Femaref

+0

Merci Femaref, mais dans mon scénario j'ai besoin de vérifier le message d'exception avec la chaîne d'exception attendue en cas d'exception levée. – BSalunke

Répondre

9

Cela me fait mal aux yeux. S'il vous plaît faire de la programmation orientée objet dans ruby.

class MyException < StandardError; end 

définira une nouvelle exception, vous pouvez sauver par

begin 
    do_something_that_raises_expected_exception 
rescue MyException 
    do_something_else 
end 

Vous aurez pas besoin de comparaison de chaîne.

Si vous voulez descendre votre route, utilisez string.match exception_name, mais je déconseille.

Un autre mot sur le sauvetage: Ne pas faire rescue Exception si possible, il suffit d'utiliser rescue, parce que Exception capture des choses comme SyntaxError trop (ce qui est sans doute pas prévu). Et les exceptions sont désapprouvées pour le contrôle de flux dans ruby, par opposition à python.

+0

Merci Tass, mais je ne veux pas changer d'autres choses, seule chose est de comparer la première ligne de la sortie de $ !. to_s() avec la chaîne que j'ai fournie dans les guillemets "". – BSalunke

+0

C'est la partie avec 'exception_name'. Mais s'il vous plaît, envoyez un bug à ce sujet. – Reactormonk

3

Bien que je suis entièrement d'accord avec Tass, voici comment vous pouvez obtenir ce que vous voulez:

if $!.to_s !~ /\AmyException\s*\n/ 
    ... 

ou

if $!.to_s.lines.first != "myException \n" 
    ... 

Mais s'il vous plaît: Ne fais pas ça.

+0

Est-ce juste moi ou est-ce que ça ressemble à "AmyExceptions": P – Tim