Tot nu toe laten we error’s gewoon zien, wat ook het handigst is als je aan het ontwikkelen bent. Maar wanneer je een systeem oplevert wil je niet dat eventueel gevoelige informatie via errors naar buiten wordt gebracht, en dus kun je deze uit zetten. Eerst gaan we eens kijken wat er eigenlijk gebeurt als je de errorhandling gewoon in de bootstrap van onze Zend Framework applicatie uitzet. Daarna gaan we kijken hoe we door middel van een Error Controller errors netjes op kunnen vangen.
Wijzigen van de bootstrap
Laten we eerst eens een error tevoorschijn toveren door naar http://localhost/bestaatniet/ te gaan. Als het goed is krijg je nu een Fatal error: Uncaught exception ‘Zend_Controller_Dispatcher_Exception’ with message ‘Invalid controller specified (bestaatniet)’. Logisch, want inderdaad, de controller bestaatnietController.php heb ik in ieder geval nog niet gemaakt.
Wanneer we nu onze bootstrap openen zijn er 2 manieren om de errors uit te zetten. Op regel 5, dmv de ini_set. En op regel 18 dmv de throwExceptions.
Wanneer we nu regel 5 veranderen in:
ini_set(’display_errors’, 0);
Dan krijgen we dus een lege pagina. Als we deze terug zetten en vervolgens regel 18 veranderen (true in false), dan krijg je de volgende error:
Fatal error: Uncaught exception ‘Zend_Controller_Dispatcher_Exception’ with message ‘Invalid controller specified (error)’
Nu is het Zend Framework dus opzoek gegaan naar een errorController, maar ook die hebben we nog niet gemaakt. Iedereen zal het met me eens zijn dat een witte pagina een gebruiker niet veel zegt en waarschijnlijk ook afschikt, dus is het zaak om dit te verhelpen en een error message neer te zetten. Dit gaan we doen met behulp van de errorController
De ErrorController
Om de errors netjes op te vangen moeten we een errorController.php maken en een view script (dus /views/scripts/error/error.phtml). Laten we dat dus eerst doen (in de default module). De errorController krijgt de volgende inhoud:
1: <?php
2: /** Zend_Controller_Action */
3: require_once ‘Zend/Controller/Action.php’;
4:
5: class ErrorController extends Zend_Controller_Action
6: {
7: public function errorAction()
8: {
9: }
10: }
Het view script geven we nog even geen inhoud. Wanneer we nu weer refreshen (http://localhost/bestaatniet/) dan zie je niets, maar in de broncode zie je dat onze layout geladen is, alleen hebben we die geen content gegeven, dus laten we dat eens doen. Daarvoor gaan we eerst kijken welke error we hebben. De error kun je ophalen met
$errors = $this->_getParam('error_handler');
Vervolgens kun je hier het type van ophalen met
$errors->type
en de exception met behulp van
$exception = $errors->exception;
Het type is een constante welke je kan vergelijken met een van de volgende 3 waarde:
Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER
Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION
Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER
De namen van de errors spreken denk ik voor zich. Waar de eerste 2 vaak worden gezien als een 404, kun je deze ook handig zo opvangen, en dan de rest anders, want OTHER zegt net zoveel als niets. Een voorbeeld van een erg simpele errorcontroller:
1: <?php
2: /** Zend_Controller_Action */
3: require_once ‘Zend/Controller/Action.php’;
4:
5: class ErrorController extends Zend_Controller_Action
6: {
7: public function errorAction()
8: {
9: /* haal de error op */
10: $errors = $this->_getParam(‘error_handler’);
11: /* welk type error is het ? */
12: switch($errors->type) {
13: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
14: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
15: /* Stuur een 404 */
16: $this->getResponse()->setRawHeader(‘HTTP/1.1 404 Not Found’);
17: echo "<h2>Error: Deze pagina bestaat niet.</h2>";
18: break;
19: default:
20: /* onbekende fout */
21: echo "<h2>Error: er trad een onbekende fout op, probeer het later nog eens</h2>";
22: /* en hier eventueel de error loggen, maar daarover later meer mbv
23: $exception = $errors->exception;*/
24: break;
25: }
26: }
27: }
28:
wanneer we nu naar localhost/bestaatniet gaan, krijgen we dit te zien. Je zou hierin nog (en dat is aan te raden) informatie kunnen laten zien zoals de gezochte pagina, en een menu om weer terug te komen of iets dergelijks. Let er op dat deze view nu in onze layout verschijnt! Dus een mooi frame kun je er al omheen zetten.
Nu kun je de simpelste errors opvangen en netjes weergeven. Let op dat typfouten en dergelijk niet mooi zullen zijn en nog steeds errors zullen geven, dus voor een productie kun je ook beter display_errors uit zetten zoals hierboven beschreven. Al met al een korte simpele eenvoudige manier om toch snel en netjes custom je errors op te vangen.

1 response so far ↓
1 GP // Jan 28, 2009 at 12:09
Bedankt voor de uitleg Bram. Ik kon met geen mogelijkheid vinden hoe je die 404 status code doorgeeft, maar dat is nu opgelost dus. Bedankt!
Leave a Comment