Exception in destructor

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Victor -

Victor -

14/10/2011 19:35:39
Quote Anchor link
Hallo,

Ik heb een exception in mijn destructor. Logischerwijs krijg ik dan de error:
Fatal error: Exception thrown without a stack frame in Unknown on line 0

Hoe kan ik toch een exception 'throwen' in mijn destructor, want ik wil liever niet overal een try cath neer hoeven te zetten..

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
/** index.php **/
try {
    $page = new Page();

    // bla
}
catch(Exception $e) {
    //bla
}

/** page.class.php **/
class Page {
    
    //bla

    public function __destruct() {
        echo $this->_template->render();
    }
    
}


/** template.class.php **/
class Template {

    //bla

    public function render() {
        $file = ROOT . DS . 'public' . DS . 'template' . DS . $_SESSION['template'] . DS . $this->_file . $this->_ext;
        if(file_exists($file)) {
            $file = file_get_contents($file);
        }

        else {
            throw new Exception('Het bestand '. $file .'bestaat niet.', 404);
        }

        
        foreach($this->_variables as $name => $value) {
            $file = preg_replace("#\{". $name ."\}#si", $value, $file);
        }

        
        return $file;
    }
    
}

?>

Edit:
PHP tags geplaatst ipv [.code] tags.
Gewijzigd op 14/10/2011 19:37:40 door Victor -
 
PHP hulp

PHP hulp

27/09/2021 00:47:42
 
Dos Moonen

Dos Moonen

14/10/2011 19:49:23
Quote Anchor link
Registreer een shutdown handler.
Gebruik error_get_last() in de shutdown handler.
Je kunt dan ook nog een ErrorException van maken als je wilt.

Je kunt Kohana's shutdown handlerKohana's shutdown handler als voorbeeld nemen als je het fijn vind werkende code bij de hand te hebben.
 
Jelmer -

Jelmer -

14/10/2011 21:22:32
Quote Anchor link
Ik zou proberen om nooit een exception te gooien in destruct, of eigenlijk om nooit actie te ondernemen in de destructor (behalve [del]vrijgeven van geheugen[/del] dingen opruimen) omdat je er dan niet onderuit kan komen.

Als simpel voorbeeld: Stel dat je wilt redirecten met header(Location: ...). Dus dan doe je dat, en roep je exit() aan omdat je voor de rest geen output hoeft te leveren. En dan wordt toch nog die ene Page instantie gerenderd.

Ander voorbeeld is dat wanneer je een exception gooit, er niets meer gebeurt met je $page object, en die dus vrijgegeven zou moeten worden. De destructor wordt aangeroepen, en tada de page waar tijdens het opbouwen een error optrad wordt alsnog getoond. (Ik weet niet 100% zeker of en in welke volgorde PHP de destructors van deze objecten aanroept wanneer het de stack aan het unwinden is, op zoek naar de catch-clause)
Gewijzigd op 14/10/2011 21:25:55 door Jelmer -
 
Pim -

Pim -

19/10/2011 23:06:57
Quote Anchor link
Verder kan de destructor op onvoorspelbare momenten worden aangeroepen.
 
Victor -

Victor -

20/10/2011 00:18:03
Quote Anchor link
ik heb er toch nog een beetje problemen mee..
Stel dat ik mijn $template->render niet in de destruct aanroep,
dan zal ik dat handmatig moeten doen, of is daar een ander trucje voor?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.