Exception in destructor
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)
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
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;
}
}
?>
/** 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 -
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.
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 -
Verder kan de destructor op onvoorspelbare momenten worden aangeroepen.
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?