10
votes

Traitement des erreurs avant les avertissements en trycatch

Je traite une fonction qui jette des erreurs et des avertissements. (associé: Un avertissement sur l'avertissement ) em> Souvent, un avertissement procédera à une erreur. Dans ces situations, je voudrais ignorer l'avertissement et traiter uniquement l'erreur. P>

D'autre part, s'il n'y a qu'un avertissement (sans erreur), alors je voudrais attraper l'avertissement. P>

J'essaie de travailler avec le trycatch code> notoirement-easy à utiliser. P>

Ma question immédiate est: Existe-t-il un moyen de forcer tryculatch code> pour traiter erreur code> S avant AVERTISSEMENT code> S (ou pour ignorer les avertissements quand il y a une erreur)? P >

Ma compréhension du ? TraceCatch CODE> La documentation est que les conditions sont traitées sur la FIFO, auquel cas la réponse à ma question immédiate n'est pas - du moins pas directement. Dans ce cas, est-il possible de traiter l'avertissement, puis de continuer à continuer tout en accrochant des erreurs? Strong> p>

solutions non disponibles: p>

  • Suppresswarnings code> # Je voudrais toujours attraper et gérer les avertissements li>
  • options (avertir = 2) code> # Certains avertissements sont inoffensifs li> ul>
    test(F.errorAndWarning)
    # ERROR CAUGHT
    


2 commentaires

Avez-vous fini par utiliser l'une des réponses ici?


Matt, j'ai utilisé un hybride de la réponse de la tienne et de Hansi. Je n'étais pas sûr où placer la coche. Je vais le placer sur Hansi's parce que je pense que son code hautement commenté sera utile pour les autres recherches - plus il pourrait utiliser quelques points supplémentaires :) Merci cependant, et pour le rappel


4 Réponses :


4
votes

J'ai écrit une fonction d'aide pratique pour évaluation dans le packer package, qui capture tous les avertissements, Erreurs et tout ce qui est imprimé sur la sortie standard, ainsi que l'objet RAW R renvoyé dans l'appel:

> library(pander)
> evals('F.errorAndWarning()')
[[1]]
$src
[1] "F.errorAndWarning()"

$result
NULL

$output
NULL

$type
[1] "error"

$msg
$msg$messages
NULL

$msg$warnings
[1] "Warning before the error"

$msg$errors
[1] "error"


$stdout
[1] "I have moved on."

attr(,"class")
[1] "evals"


0 commentaires

5
votes

J'écrirais une fonction qui exécute une expression et donne la priorité aux erreurs. xxx


1 commentaires

Cela a l'air très utile, merci. Je vais devoir le digérer pendant une minute



9
votes

Ceci concerne la ", est-il possible de traiter l'avertissement, puis de continuer à continuer tout en accrochant des erreurs?" question.

J'ai eu un problème similaire où je voulais lier mon Les fonctions de journalisation des avertissements et des erreurs d'essayer d'essayer et continuent toujours après des avertissements et peuvent également effectuer plusieurs tentatives d'essayer de prendre des captures, par exemple pour accéder à un lecteur de réseau fragile. C'est ce que j'ai fini par utiliser. Cette version ou une version plus simplifiée pourrait aider à ce que votre après. xxx


0 commentaires

2
votes

Très vaste travail et beau travail de toutes les trois réponses, mais je pense que beaucoup de gens recherchent également un moyen bref et simple de gérer un avertissement, mais une exécution continue. Qui peut être fait assez peu de temps, comme l'a montré Matthew: En appelant un redémarrage (et en utilisant SassAlinghandLers):

test <- function(FUN) withCallingHandlers(
  expr=FUN(),
  error=function(e) cat("ERROR CAUGHT\n"),
  warning=function(w) {cat('WARNING CAUGHT\n'); invokeRestart(findRestart('muffleWarning'))}
)


0 commentaires