2016-05-24 70 views
5

Uso la mia semplice gestione degli errori e posso effettivamente catturare lo & registro di tutto ciò di cui ho bisogno. Ma ora ho bisogno di prendere un errore con try{}catch(){}. L'errore, che mi aspetto di verificarsi a volte in quel punto, è l'errore "Chiamata a metodo non definito". Riesco ad afferrare in questo modo:Come rilevare l'errore "Chiama per metodo non definito" in PHP 7?

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

Ma la classe Error nella clausola catch è un po 'al generico. Mi piacerebbe prendere solo questo tipo di errore.

C'è un modo per limitare l'acquisizione a un particolare "tipo" di errori?

Senza usare strpos($errorMessage) ...;)

+1

No, solo diverse classi di errore/eccezione; e questa è solo una generica 'Error' classe –

+0

Non sono sicuro che' __call() 'intercetti le chiamate a metodi inesistenti (o solo a metodi non accessibili), e ti permetta di lanciare un'eccezione personalizzata che potrebbe quindi essere catturato e consegnato in modo diverso ad altri errori –

+0

Probabilmente si vuole rilevare qualsiasi errore che si verifica, non solo uno specifico. Ma potresti fare un'azione specifica all'interno del tuo blocco 'catch' in base al tipo di errore generato – WillardSolutions

risposta

3

Utilizzando un metodo magico __call() nelle classi possono essere utilizzati per generare eccezioni personalizzate se un metodo non esiste

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

+0

Grazie mille per la tua risposta e demo! Sfortunatamente non risolve il problema, poiché ha una limitazione molto scomoda: l'uso di questo approccio presuppone che la classe 'SomeClass' del metodo' someMethodTheObjectDoesntProvide() 'debba implementare qualcosa come un'interfaccia' HasCallMagicMethod'. È normale per le eccezioni e gli errori non incorporati, ma "Avviso" è uno predefinito e dovrebbe essere catturato senza implementare nulla di speciale nella classe "lancio". Tuttavia, il problema non può essere risolto in un altro modo (ancora) e il tuo suggerimento è un'ottima soluzione. Grazie ancora! – automatix