Nasıl bir "catchable ölümcül hata" yakalayabilirsiniz

1 Cevap php

Benim sınıf birinde PHP5 Tür Dayatma uygulamak çalışıyorum,

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

class ClassB {}
class ClassWrong{}

Doğru kullanım:

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

üretim hatası:

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

Catchable fatal error: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassWrong given...

O hatayı yakalamak mümkün olup olmadığını (o "catchable" diyor beri) Biliyorum miyim? ve evet, nasıl?

Teşekkür ederim.

1 Cevap

http://docs.php.net/errorfunc.constants diyor ki:

E_RECOVERABLE_ERROR ( integer )
Catchable fatal error. It indicates that a probably dangerous error occured, but did not leave the Engine in an unstable state. If the error is not caught by a user defined handle (see also set_error_handler()), the application aborts as it was an E_ERROR.

ayrıca bkz: http://derickrethans.nl/erecoverableerror.html

örneğin

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.';

baskılar

'catched' catchable fatal error
done.

edit: Ama siz "yapabilir" Eğer bir try-catch bloğu ile işleyebilir bir istisna

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.';

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