Est-ce que ruby vous permet de traiter les avertissements comme des erreurs? Une des raisons pour lesquelles je voudrais faire ceci est de m'assurer que si l'enlèvement d'une ligne de code implique un avertissement, j'ai la possibilité de m'assurer que le mutant soit tué.Pouvez-vous demander à Ruby de traiter les avertissements comme des erreurs?
Répondre
Il n'y a malheureusement aucun moyen de le faire, du moins pas sur la plupart des versions de Ruby là-bas (variations peut exister), court de surveiller la sortie du programme et l'abandon quand un avertissement apparaît sur l'erreur standard . Voici pourquoi:
- Ruby définit
Kernel.warn
, que vous pouvez redéfinir à faire ce que vous voulez (y compris la sortie), et que vous seriez attendre (espoir) à utiliser régulièrement par Ruby signaler (y compris les avertissements avertissement d'analyse interne, par exemple), mais - méthodes mises en oeuvre en mode natif (en C) à l'intérieur Ruby à son tour directement appeler une méthode native appelée
rb_warn
desource/server.c
, complètement en contournant votre redéfinition deKernel.warn
(par ex. l'avertissement «string literal in condition
», par exemple, émis lorsque vous faites quelque chose comme:do_something if 'string'
, est imprimé par lerb_warn
natif desource/parse.c
) - pour rendre les choses encore pire, il y a une méthode supplémentaire, natif
rb_warning
, qui peut être utilisé par Ruby pour consigner les avertissements si-w
ou-v
est spécifié.
Donc, si vous avez besoin de prendre des mesures uniquement sur les avertissements générés en appelant Kernel.warn
alors de votre code d'application tout simplement redéfinir Kernel.warn
. Sinon, vous avez exactement deux options:
- alter
source/error.c
pour sortir dansrb_warn
etrb_warning
et Reconstruire Ruby - surveiller la sortie d'erreur standard de votre programme pour '
: warning:
', et Abandonner sur (etrb_warn_m
?) match de
Merci. Une réponse autoritaire si jamais j'en ai vu une! –
Pour surveiller la sortie d'erreur standard de votre programme pour ": warning:", http://stackoverflow.com/a/32941696/18096 peut être utile. –
vous pouvez également utiliser potentiellement DTrace et intercepter les appels à rb_warn
et rb_warning
, mais qui ne va pas à produire des exceptions que vous pouvez sauver de quelque part. Au contraire, il va juste les mettre quelque part, vous pouvez facilement les connecter.
J'ai déposé une demande de fonctionnalité pour un drapeau de ligne de commande pour faire des mises en garde d'exceptions ... http://redmine.ruby-lang.org/issues/show/3916 –
Le docteur Qu'est-ce que RFE a recueilli une réponse en notant que $ DEBUG = true provoque la conversion d'un avertissement en une exception "trop d'arguments pour la chaîne de format". –
@TheDoctorQuel lien est périmé. Nouveau lien: https://bugs.ruby-lang.org/issues/3916 –