Pregunta

Estoy tratando de poner en práctica Hinting Tipo de PHP5 en uno de mi clase,

class ClassA {
    public function method_a (ClassB $b)
    {}
}

class ClassB {}
class ClassWrong{}

Uso correcto:

$a = new ClassA;
$a->method_a(new ClassB);

error producir:

$a = new ClassA;
$a->method_a(new ClassWrong);
  

error fatal capturable: Argumento 1 pasó a ClassA :: method_a () debe ser una instancia de ClassB, instancia de ClassWrong dado ...

se puede saber si es posible coger ese error (ya que dice "capturable")? y en caso afirmativo, ¿cómo?

Gracias.

¿Fue útil?

Solución

Actualización: Esto no es un error fatal capturable más en php 7. En lugar de una "excepción" se tira. Una "excepción" (entre comillas) que no se deriva de Excepción rel="noreferrer"> pero Error ; sigue siendo un Throwable y puede ser manejado con un bloque normal try-catch. ver https://wiki.php.net/rfc/throwable-interface

por ejemplo.

<?php
class ClassA {
  public function method_a (ClassB $b) { echo 'method_a: ', get_class($b), PHP_EOL; }
}
class ClassWrong{}
class ClassB{}
class ClassC extends ClassB {}


foreach( array('ClassA', 'ClassWrong', 'ClassB', 'ClassC') as $cn ) {
    try{
      $a = new ClassA;
      $a->method_a(new $cn);
    }
    catch(Error $err) {
      echo "catched: ", $err->getMessage(), PHP_EOL;
    }
}
echo 'done.';

impresiones

catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassA given, called in [...]
catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassWrong given, called in [...]
method_a: ClassB
method_a: ClassC
done.

vieja respuesta para las versiones pre-php7:
http://docs.php.net/errorfunc.constants dice:

E_RECOVERABLE_ERROR (entero)
capturable error fatal. Se indica que se produjo un error, probablemente peligroso, pero no dejó el motor en un estado inestable. Si el error no es capturado por un mango definido por el usuario (véase también set_error_handler () ), la aplicación aborta ya que era una E_ERROR.

véase también: http://derickrethans.nl/erecoverableerror.html

por ejemplo.

function myErrorHandler($errno, $errstr, $errfile, $errline) {
  if ( E_RECOVERABLE_ERROR===$errno ) {
    echo "'catched' catchable fatal error\n";
    return true;
  }
  return false;
}
set_error_handler('myErrorHandler');

class ClassA {
  public function method_a (ClassB $b) {}
}

class ClassWrong{}

$a = new ClassA;
$a->method_a(new ClassWrong);
echo 'done.';

impresiones

'catched' catchable fatal error
done.

editar: Pero puede "presentar" una excepción que se puede manejar con un bloque try-catch

function myErrorHandler($errno, $errstr, $errfile, $errline) {
  if ( E_RECOVERABLE_ERROR===$errno ) {
    echo "'catched' catchable fatal error\n";
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    // return true;
  }
  return false;
}
set_error_handler('myErrorHandler');

class ClassA {
  public function method_a (ClassB $b) {}
}

class ClassWrong{}

try{
  $a = new ClassA;
  $a->method_a(new ClassWrong);
}
catch(Exception $ex) {
  echo "catched\n";
}
echo 'done.';

Vea: http://docs.php.net/ErrorException

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top