vyjímka v destruktoru

před 11 lety

deric
Člen | 93
+
0
-

Možná php nedovoluje vyjímky v destruktoru, nicméně pokud se nějaká nastane, tak způsobí fatal error a tedy pád celé aplikace (třeba warning by byl fajn…)

V lepším případě se objeví naprosto nic neříkající hláška, nebo to zůstane jenom u bílé obrazovky.

Fatal error: Exception thrown without a stack frame in Unknown on line 0

Problém způsobí např. následující kód:

class MyClass {
  function __destruct(){
    throw new Exception('fail');
  }
}
$n = new MyClass();

S použitím Laděnky je aspoň víme kde vznikla.

require_once 'Nette/Debug.php';
// enable Nette/Debug
Debug::enable();

class MyClass {
  function __destruct(){
    try{
        throw new Exception('fail');
   }catch(Exception $e){
        Debug::exceptionHandler($e);
   }
  }
}
$n = new MyClass();

Bug už je to pár let starý, takže asi nebude v nejbližší době opraven :-(

http://bugs.php.net/bug.php?…

Napadá vás lepší řešení?

testováno na: PHP/5.2.6–2ubuntu4 with Suhosin-Patch

před 11 lety

Jod
Člen | 703
+
0
-

Daj si logovať errory do súboru, alebo na mail. Deštruktor sa predpokladám vykonáva až po odoslaní stránky ku klientovi, keď sa rušia objekty (pokiaľ ich nerušíš ručne v kóde), takže sa hláška nezobrazí, ni? Alebo to má nejaký GC ako .NET? :D

Inak mne php rovnaký error hlási, keď mám zle nastavené práva na súbory. Bude to asi univerzálna error php hláška na neznáme chyby =DD

před 11 lety

hrach
Člen | 1818
+
0
-

Stejná chyba se myslím vyhazuje i ve chvíli, kdy vyhodíme Exception v našem exceptionHandleru.

před 11 lety

deric
Člen | 93
+
0
-

Destruktor se musí provést před odesláním stránky klientovi, když se zobrazuje tato hláška. Když jsem to měl uvnitř Nette aplikace, tak se ta chyba ani nezapsala do systémového logu, což je zvláštní (ale těžko říct čím to bylo…)

hrach napsal(a):

Stejná chyba se myslím vyhazuje i ve chvíli, kdy vyhodíme Exception v našem exceptionHandleru.

no, to asi není dobrý nápad vyhazovat exception v excetion_handleru :) jo, chyba je to stejná…

function exception_handler($exception) {
  echo "Uncaught exception: " , $exception->getMessage(), "\n";
  //this cause fatal error
  throw new Exception('fail2');
}

set_exception_handler('exception_handler');

 throw new Exception('fail');

před 11 lety

hrach
Člen | 1818
+
0
-

tak právě že exception handler býva většinou sofistikovaný, no, a nenapdalo mě, že tu chybu může xyz někdě uvnitř svého volání. Myslel jsem, že se handler spusti znovu (a to už sem ošetřené měl, aby nedošlo o opakované chybě :))