Comment créer un message de sortie

208

Y a-t-il un appel de fonction d'une ligne qui quitte le programme et affiche un message? Je sais qu'en Perl, c'est aussi simple que:

die("Message goes here")

J'en ai assez de taper ceci:

puts "Message goes here"
exit
Chris Bunch
la source
10
Un petit commentaire, vos putsécritures à stdout, alors dieécrit à stderr, donc: $stderr.puts "Message goes here".
cdarke
Je sais que ce n'était pas une réponse, mais cela a répondu à ma question, merci
Patrick
Juste pour la référence, en Python c'est le cas sys.exit("Message goes to stderr").
anatoly techtonik

Réponses:

361

La abortfonction fait cela. Par exemple:

abort("Message goes here")

Remarque: le abortmessage sera écrit STDERRpar opposition à putsqui sera écrit STDOUT.

Chris Bunch
la source
6
Hou la la! Belle trouvaille! Dommage qu'ils n'aient pas simplement surchargé la sortie avec cette fonctionnalité ....
Mike Stone
56
Remarque, abandonner quitte le programme avec un état faux qui représente un échec. exit par défaut quitte avec un statut true représentant le succès. Assurez-vous d'utiliser le bon pour la situation.
Alex Spurling
1
ré. Le commentaire de Mike Stone, il semble parfois que Ruby a été écrit par une équipe de personnes qui n'avaient aucune communication entre eux, n'est-ce pas? (Pourtant, il est si facile de le programmer.)
JellicleCat
24

Si vous souhaitez signaler une erreur réelle dans votre code, vous pouvez déclencher une RuntimeErrorexception:

raise RuntimeError, 'Message goes here'

Cela imprimera une trace de pile, le type de l'exception levée et le message que vous avez fourni. Selon vos utilisateurs, une trace de pile peut être trop effrayante et le message réel peut se perdre dans le bruit. En revanche, si vous mourrez à cause d'une erreur réelle, un stacktrace vous donnera des informations supplémentaires pour le débogage.

Jörg W Mittag
la source
24
Vous n'avez pas besoin de mentionner RuntimeError pour en déclencher une (c'est le type d'exception par défaut levé), le code suivant suffira donc: raise 'Message goes here'
sunaku
sunaku - bien que votre commentaire soit parfaitement valide, j'ai souvent trouvé qu'être plus explicite peut être utile, en particulier pour d'autres personnes lisant le code par la suite.
shevy
2

Je n'ai jamais entendu parler d'une telle fonction, mais ce serait assez trivial à mettre en œuvre ...

def die(msg)
  puts msg
  exit
end

Ensuite, si cela est défini dans un fichier .rb que vous incluez dans tous vos scripts, vous êtes en or .... juste parce qu'il n'est pas intégré ne signifie pas que vous ne pouvez pas le faire vous-même ;-)

Mike Stone
la source
3
Il s'avère que la fonction 'abandon' le fait (voir ma réponse ci-dessous)
Chris Bunch
1
Pourquoi écrire du code quand la fonction d'abandon le fait pour vous?
Gary Haran, du
2
@ChrisBunch Ce n'est pas la même chose que la fonction d' abandon : exitrevient par défaut comme si elle avait réussi. abortrenvoie un échec. exit 1renverra également un échec.
TemporalWolf
2

Je suis arrivé ici à la recherche d'un moyen d'exécuter du code à la fin du programme.
Trouvé ceci :

Kernel.at_exit { puts "sayonara" }
# do whatever
# [...]
# call #exit or #abort or just let the program end
# calling #exit! will skip the call

Appelé plusieurs fois enregistrera plusieurs gestionnaires.

Giuse
la source