2017-01-20 2 views
1

Unterstützt R die Ausnahmebehandlung nur für bestimmte Ausnahmen?Wie kann die Ausnahmebehandlung auf bestimmte Ausnahmen ausgerichtet werden?


In Python zum Beispiel kann man die Ausnahmebehandlung auf bestimmte Ausnahmetypen beschränken; Beispiel:

try: 
    return frobozz[i] 
except IndexError: 
    return DEFAULT 

In diesem Beispiel wird die Ausnahmebehandlung in nur treten, wenn i eine ganze Zahl ist derart, dass i >= len(frobozz) oder i < -len(frobozz), wird aber nicht die Ausnahme, fangen die aus beispielsweise der Fall, wenn i die Zeichenfolge "0" (Das wäre ein TypeError, anstatt ein IndexError).

+0

Was versuchen Sie WIRKLICH? –

+0

Normalerweise würden Sie eine Eingabeüberprüfung implementieren, um die Ausnahme zu vermeiden. – Roland

+0

Mir ist ein ähnliches Feature in R nicht bekannt, aber Fehlerbehandlungsfunktionen sind noch nicht vollständig erforscht. Ein nützlicher Ort zum Starten ist durch Lesen der Haupthilfedatei und Links linka in '? TryCatch' enthalten. – lmo

Antwort

1

Wellllll ... ja und nein, und meistens nein.

Jede Python-Exception ist in eine bestimmte Fehlerklasse eingebettet, die von Error abgeleitet ist, und Python-Module sollen die "richtigen" Arten von Fehlern auslösen. Zum Beispiel sollte ein Index außerhalb des Bereichsfehlers IndexError auslösen. Die Basissprache kennt diese Fehler und Sie können den entsprechenden Fehlertyp in Ihrer except ... -Klausel finden.

R tut das nicht. Fehler sind nicht typisiert; Es gibt keinen wesentlichen Unterschied zwischen einem Index-Fehler und einem anderen Fehler.

Das heißt, Sie können unter bestimmten, sehr begrenzten Umständen betrügen.

> y <- tryCatch(x[[2]], error = function(e) e) 
> y 
<simpleError in x[[2]]: subscript out of bounds> 
> y$message 
[1] "subscript out of bounds" 

Der Schlüssel hier ist die Verwendung der tryCatch Funktion und die error Klausel. Die error-Klausel in einem tryCatch ist eine Funktion einer Variablen, die beliebige Operationen an e ausführen kann, die ein Objekt vom Typ 'simpleError' ist und ein Element namens 'message' enthält. Sie können Nachricht analysieren und separat

> y <- tryCatch(x[[2]], 
    error = function(e) { 
    if ('subscript out of bounds' == e$message) return(NA) else stop(e)) 
    }) 
> y 
[1] NA 

Dies funktioniert nur interessante Fälle behandeln, wenn Sie tatsächlich die Fehlerzeichenfolge erkennen kann, nach dem Sie suchen möchten, und dass nicht garantiert sind. (Andererseits ist es auch in Python nicht garantiert, also unterscheiden sich die Dinge nicht wirklich voneinander.)

Endgültige Frage: Warum im Namen des Himmels tun Sie das? Was sind Sie wirklich versuchen zu tun?

+0

Nur aus Gründen der Übersichtlichkeit wird 'x [['a']]' jedoch nicht berücksichtigt, wodurch NA zurückgegeben wird. R unterscheidet nicht zwischen Fehlern aufgrund von Wertetypen in Suchvorgängen. Kurz, den Suchoperator neu zu definieren - was ich Ihnen dringend rate, dies nicht zu tun! - Ich kann mir gar nicht vorstellen, wie ich das überhaupt machen soll. – JWLM

Verwandte Themen