2016-05-24 1 views
5

Я использую свою собственную простую обработку ошибок и могу фактически поймать & регистрировать все, что мне нужно. Но теперь мне нужно поймать ошибку с try{}catch(){}. Ошибка, которую я ожидаю иногда в этом месте, является ошибкой «Вызов неопределенного метода». Я могу поймать его, как это:Как уловить ошибку «Вызов неопределенного метода» в PHP 7?

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

Но Error класса в предложении catch является немного к родовому. Я бы хотел поймать только этот тип ошибок.

Есть ли способ ограничить захват определенным «типом» ошибок?

без использования strpos($errorMessage) ...;)

+1

Нет, только разные классы ошибок/исключений; и это всего лишь общий класс «Ошибка» –

+0

. Я не уверен, что '__call()' перехватит вызовы к несуществующим методам (или только к не доступным методам) и позволит вам создать настраиваемое исключение, которое могло бы затем быть пойманным и переданным по-разному другим ошибкам. –

+0

Возможно, вы захотите поймать любую ошибку, которая произошла, а не только конкретную. Но вы могли бы предпринять определенное действие в вашем блоке 'catch' на основе типа ошибки, вызванной – WillardSolutions

ответ

3

Использование волшебной __call() метод в ваших классах может быть использован, чтобы бросить пользовательские исключения, если метод не существует

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

Большое спасибо за ваш ответ и демонстрацию! К сожалению, это не решает проблему, так как имеет очень неудобное ограничение: с помощью этого подхода предполагается, что класс 'SomeClass' метода' someMethodTheObjectDoesntProvide() 'должен реализовать что-то вроде интерфейса HasCallMagicMethod. Это нормально для не встроенных исключений и ошибок, но 'Уведомление' является встроенным и должно быть уловлено, не реализуя ничего особенного в классе« бросания ». Тем не менее, проблема не может быть решена по-другому (пока), и ваше предложение является очень хорошим решением. Спасибо за это еще раз! – automatix

Смежные вопросы