2016-05-24 19 views
5

Kendi basit hata işlemimi kullanıyorum ve aslında ihtiyacım olan her şeyi & kaydedebiliyorum. Ama şimdi try{}catch(){} ile bir hata yakalamam gerekiyor. Bazen o yerde meydana gelmesini beklediğim hata, "Tanımlanamayan yönteme çağrı" hatasıdır. Ben böyle yakalayabilirsiniz:PHP 7'de "Tanımsız yöntem çağrısı" hatası nasıl yakalanır?

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

Ama catch fıkrada Error sınıf jenerik için biraz olduğunu. Sadece bu tür bir hatayı yakalamak istiyorum.

Yakalamayı belirli bir "tür" hatayla kısıtlamanın bir yolu var mı? strpos($errorMessage) kullanmadan

...; bir yöntem yoksa)

+1

Hayır, yalnızca farklı hata/istisna sınıfları; ve bu sadece bir genel 'Hata' sınıfı –

+0

'__call() 'olmayan mevcut yöntemlere (veya yalnızca erişilemeyen yöntemlere) çağrıları kesmek ve sizin için özel bir istisna atmak için izin vereceğinden emin değilim Daha sonra diğer hatalara –

+0

farklı şekilde yakalanır ve teslim edilir. Muhtemelen herhangi bir hatayı yakalamak istersiniz, sadece belirli bir tanesini değil. Ancak, "catch" bloğunuzda, atılan hata türüne göre belirli bir eylemi gerçekleştirebilirsiniz – WillardSolutions

cevap

3

Sınıflarınızdaki sihirli __call() yöntemi kullanarak özel istisnalar atmak için kullanılabilir

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

Cevabınız ve demonuz için çok teşekkür ederim! Ne yazık ki, bu problemi çözmüyor, çünkü bu, çok sakıncalı bir sınırlamaya sahip olduğu için: Bu yaklaşımın kullanılması, 'SomeClass' metodunun 'someMethodTheObjectDoesntProvide()' sınıfının bir 'HasCallMagicMethod 'arayüzü gibi bir şey uygulamak zorunda olduğunu varsayar. Yerleşik olmayan istisnalar ve hatalar için normaldir, ancak 'Uyarı' yerleşik birdir ve "fırlatma" sınıfında özel bir şey uygulamadan yakalanmalıdır. Ancak, sorun başka bir şekilde çözülemez (henüz) ve öneriniz çok iyi bir çözümdür. Bir kez daha için teşekkürler! – automatix

İlgili konular