Fehlerbehandlung in R – Handhabung von Ausnahmen mit trycatch

Markus Berroth Blog, Data Science, Statistik

Der vorherige Teil der Reihe drehte sich um die Handhabung von unerwarteten Fehlern und Bugs. Doch manchmal erwartet man das Auftreten von Fehlern, beispielsweiße falls man das gleiche Modell für mehrere Datensätze anwenden möchte. Dabei kann unter anderem der Fehler auftreten, dass das Modell aufgrund von fehlender Varianz nicht geschätzt werden kann. In diesem Fall möchte man nicht, dass durch diesen einen Fehler die komplette Schätzung abbricht, sondern, dass mit der nächsten Schätzung fortgefahren wird.

In R gibt es drei unterschiedliche Methoden um dies zu erreichen:

  • try() ignoriert den Fehler und führt die Berechnung fort.
  • trycatch() lässt eine zusätzlich Fehlermeldung/Aktion zuweisen.
  • withCallingHandlers() ist eine besondere Variante von trycatch() , welches die Ausnahme lokal handhabt. Es wird nur selten benötigt, daher fokussieren wir uns auf die beiden erstgenannten.

try

Mit try() wird der Code weiterhin ausgeführt unbeachtet von auftretenden Fehlern.
Im folgenden Beispiel tritt ein Fehler auf, wodurch der Prozess abgebrochen wird und es wird kein Wert zurückgegeben.

Bespiel Fehlermeldung

Fügen wir die fehlererzeugende Funktion in ein try() ein, wird die Fehlermeldung weiterhin angezeigt, jedoch wird der restliche Code ausgeführt und wir bekommen weiterhin einen Return.

Beispiel try

Aktivieren wir die Option silent = TRUE innerhalb der try()-Funktion, wird nicht einmal mehr die Fehlermeldung angezeigt.

Code-Blöcke werden innerhalb von try() in der geschweiften Klammer {} zusammengefasst.

Beispiel Fehlermeldung try

Zusätzlich ist es möglich die Klasse von try() abzufragen. Taucht kein Fehler auf, ist es die Klasse des letzten Returns, taucht jedoch einer auf, ist es eine eigene „try-error”-Klasse.

Bespiel Klasse von try

Dadurch kann im Nachhinein überprüft werden, ob die Funktion erfolgreich ausgeführt wurde, dies ist besonders hilfreich, wenn man eine Funktion auf mehrere Objekte anwendet.

trycatch

Im Unterschied zu try() können mit trycatch() nicht nur Fehler gehandhabt werden, sondern auch Warnungen, Messages und Abbrüche. Eine weitere Besonderheit ist, dass je nach auftretender Ausnahme unterschiedliche Funktion aufgerufen werden können. In der Regel werden hierbei Default-Werte übergeben oder bedeutsamere Meldungen erzeugt. Im folgenden Beispiel wollen wir die Funktion über einen Vektor mit den Ausprägungen Vektor = data.frame(4, 2, -3, 10, "hallo") loopen. Wobei die log-Funktion bei negativen Werten eine Warnung ausgibt und für Factors und Strings einen Fehler.

Beispiel trycatch

Das letzte, wichtige Argument von trycatch() ist finally. Die dort angegebene Funktion wird als letztes ausgeführt, ungeachtet ob der vorherige Code erfolgreich durchlief oder abgebrochen ist. Dies ist nützlich um nicht mehr benötigte Objekte zu löschen oder Verbindungen zu schließen.

Der nächste Artikel der Reihe wird sich um Unit-Testing drehen.

Referenzen

  1. Advanced R by Hadley Wickham
Über den Autor
Markus Berroth

Markus Berroth

I am data scientist at STATWORX and I love creating novel knowledge from data. In my time off, I am always open for a weekend trip.