2016-05-24 5 views
5

Ich benutze meine eigene einfache Fehlerbehandlung und kann tatsächlich fangen & alles, was ich brauche. Aber jetzt muss ich einen Fehler mit try{}catch(){} fangen. Der Fehler, den ich manchmal an dieser Stelle vermute, ist der Fehler "Call to undefined method". Ich kann es so fangen:Wie fangen Sie den Fehler "Aufruf an undefinierte Methode" in PHP 7?

try { 
    $someObject->someMethodTheObjectDoesntProvide(); 
} catch (Error $e) { 
    // do something else 
} 

Aber die Error Klasse in der catch Klausel ist ein wenig zu allgemein gehalten. Ich möchte nur diese Art von Fehler abfangen.

Gibt es eine Möglichkeit, das Fangen auf einen bestimmten "Typ" von Fehlern zu beschränken?

Ohne strpos($errorMessage) mit ...;)

+1

Nein, nur verschiedene Fehler/Ausnahmeklassen; und das ist nur eine generische 'Error' Klasse –

+0

Ich bin mir nicht sicher, ob' __call() 'Aufrufe auf nicht existierende Methoden (oder nur auf nicht zugreifbare Methoden) abfängt, und erlaubt Ihnen, eine benutzerdefinierte Ausnahme zu werfen, die könnte dann gefangen werden und anders als andere Fehler übergeben –

+0

Sie wollen wahrscheinlich jeden Fehler, der passiert, nicht nur einen bestimmten zu fangen. Aber Sie könnten eine bestimmte Aktion in Ihrem 'catch' Block basierend auf dem Typ des Fehlers ausgelöst – WillardSolutions

Antwort

3

eine magische __call() Methode in Klassen können verwendet werden, um benutzerdefinierte Ausnahmen auslösen, wenn eine Methode nicht

class myCustomException extends Exception { 
} 

class someClass { 
    public function __call($name, $arguments) { 
     if (!method_exists($this, $name)) { 
      throw new myCustomException($name . ' has shuffled the mortal coil'); 
     } 
    } 
} 


$someObject = new someClass(); 
try { 
    $someObject->someMethodTheObjectDoesntProvide(); 
} catch (myCustomException $e) { 
    echo $e->getMessage(); 
} 

Demo

existiert
+0

Vielen Dank für Ihre Antwort und Demo! Leider löst es das Problem nicht, da es eine sehr unpraktische Einschränkung hat: Bei diesem Ansatz wird vorausgesetzt, dass die Klasse 'SomeClass' der Methode' someMethodTheObjectDoesntProvide() 'so etwas wie eine 'HasCallMagicMethod'-Schnittstelle implementieren muss. Es ist normal für nicht eingebaute Exceptions und Fehler, aber "Notice" ist ein eingebautes und sollte abgefangen werden, ohne etwas Spezielles in der "werfenden" Klasse zu implementieren. Das Problem kann jedoch (noch) nicht auf andere Weise gelöst werden und Ihr Vorschlag ist ein sehr guter Workaround. Nochmals vielen Dank dafür! – automatix

Verwandte Themen