S7
zurückException Handling in TYPO3
28.05.2019
Thema: TYPO3

Exceptions in TYPO3, wie gehe ich damit um?

Exception Handling in TYPO3

Beim Kunden mit den FlashMessages war es auch notwendig, Exceptions so sauber wie möglich abzufangen und eben nicht dem Webseiten-Anwender einfach nur die Exception um die Ohren zu werfen.

Der Relaunch des Systems gestaltete sich insofern schon schwierig, als dass die ehemals betreuende Agentur irgendwann angefangen hat, um TYPO3 4.5 herum zu programmieren. Das führte zu diversen Fehlern, die eher schwer zu debuggen waren.

Aus den Fehlern wollte ich beim Relaunch lernen und soweit optimieren, wie möglich. Dazu gehört auch, dass Exceptions, die vorhersehbar und vermeidbar sind, entsprechend behandelt werden und dem User statt der typischen Fehlerseite eine korrekte Nachricht ausgegeben wird, was genau da gerade schief gelaufen ist.

Nach einigen Experimenten mit dem Debugger und durchforsten des StackTrace bin ich zu der Erkenntnis gekommen, dass jede Extbase-Action zuerst durch die ControllerInterface-Methode processRequest() läuft.

Dies machte ich mir zu eigen und habe einen BaseConrtoller geschrieben, der eben diese processRequest() überlädt und den parent-call in einen try-catch-Block packt.

/**
 * @param RequestInterface $request
 * @param ResponseInterface $response
 * @throws Exception
 */
public function processRequest(RequestInterface $request, ResponseInterface $response)
{
    try {
        parent::processRequest($request, $response);
    } catch (Exception $e) {
        $this->handleProcessRequestException($e);
    }
}

Somit ist sichergestellt, dass jede Exception bei mir landet und ich sie einzeln behandeln kann.

Mein BaseController ist abstract, somit kann ich die handleProcessRequestException() als abstract method definieren und der eigentliche Controller hat sie zu behandeln, denn der weiß am besten, welche Exceptions für ihn wichtig sind und wie er sie zu behandeln hat.

Was genau macht die Methode jetzt aber im eigentlichen Controller?

Sie handelt Exceptions je nach Typ ab. Das kann zum Beispiel so aussehen:

/**
 * @param Exception $exception
 * @return void
 * @throws UnsupportedRequestTypeException
 * @throws Exception
 */
public function handleProcessRequestException(Exception $exception)
{
    if ($exception instanceof TargetNotFoundException) {
        $messageTitle = $this->translate('job.list.notfound.header');
        $messageBody = $this->translate('job.list.notfound.message');
        $this->setFlashMessage($messageBody, $messageTitle);
        $this->redirect('list');
        exit;
    }
    
    throw new Exception($exception->getMessage(), $exception->getCode());
}

Die TargetNotFoundException wird geworfen, wenn ein Datensatz nicht existiert, also hidden oder deleted ist. Das sollte eine der am häufigsten geworfenen Exceptions sein und ist auch notwendig.

Ein Datensatz, der ein Ablaufdatum hat und dann nicht mehr aufrufbar ist, zum Beispiel ein Termin, der abgelaufen ist. Suchmaschinen haben den absoluten Link aber eventuell noch in der Liste. Standardverhalten von TYPO3 ist jetzt, dass die showAction in eine TargetNotFoundException läuft und einen StackTrace inklusive Fehlermeldung wirft.

Das ist unschön, denn weder will man seinen Code, noch überhaupt eine Fehlermeldung auf der Website veröffentlichen.

Mit oben gezeigtem Code-Snippet kann somit ein sauberer Redirect inklusive FlashMessage gesendet werden, der die Website sauber funktionieren lässt, man bleibt navigierbar und erhält eine korrekte Meldung, was genau hier schief gelaufen ist.

Die Methode $this->translate(); ist eine Helper des BaseController, welche einfach nur

LocalizationUtility::translate($key, 'my_extension');

aufruft. Das erspart einen Code overhead, wenn man im Controller übersetzen muss.

Das funktioniert sehr gut. Bis man wirklich einen redirect braucht.

Ein redirect wird in TYPO3 immer über eine bestimmte Exception abgefangen und dort behandelt. Meine Methode oben wirft zwar ihr unbekannte Exceptions weiter, aber in dem Fall nicht korrekt.

Das Resultat ist, kein einziger redirect innerhalb dieses Controllers wird noch ausgeführt.

Hier habe ich mit meinem Kollegen einiges an Debugging-Arbeit benötigt, aber wir haben die Stelle gefunden und wissen, was notwendig ist, damit die redirects wieder tun.

if ($exception->getCode() == 1476045828) {
    throw new StopActionException($exception->getMessage(), $exception->getCode());
}

Der Controller wirft die StopActionException mit oben genanntem Code. Die gesamte handleProcessRequestException() sieht also wie folgt aus:

/**
 * @param Exception $exception
 * @return void
 * @throws StopActionException
 * @throws UnsupportedRequestTypeException
 * @throws Exception
 */
public function handleProcessRequestException(Exception $exception)
{
    if ($exception instanceof TargetNotFoundException) {
        $messageTitle = $this->translate('notfound.header');
        $messageBody = $this->translate('notfound.message');
        $this->setFlashMessage($messageBody, $messageTitle);
        $this->redirect('list');
        exit;
    }
    if ($exception->getCode() == 1476045828) {
        throw new StopActionException($exception->getMessage(), $exception->getCode());
    }
    throw new Exception($exception->getMessage(), $exception->getCode());
}

Auch interessant hier ist die RequiredArgumentMissingException. Die tritt auf, wenn eine action ohne benötigten Parameter aufgerufen wird.

Eventuell ist der gesamte Workflow noch verbesserungswürdig, aber er bietet meiner Meinung nach eine gute Möglichkeit, mit wichtigen Exceptions korrekt umzugehen und in Verbindung mit den FlashMessages eine saubere Möglichkeit, Fehler auf der Website zu behandeln, ohne den Besucher zu vertreiben.

Ähnliche Beiträge
30.10.2019

Die Bezahlschnittstelle von Wirecard

Dies ist ein Tutorial zur Integration von Kreditkartenzahlung auf einer Website mithilfe der Bezahlschnittstelle von Wirecard.  

EuGH-Urteil zu Cookies
18.10.2019

Das EuGH-Urteil zum setzen von Cookies

Was heißt das jetzt für meine Website?

Die Folgen des Urteils des Europäischen Gerichtshofs  

Barrierefreiheit auf Websites
18.09.2019

Barrierefreiheit auf Websites

Wie wird eine Seite für alle zugänglich?

Optimierung für alle User  

01.08.2019

Eröffnungsveranstaltung fumes and perfumes

Die ganzjährige Fotoausstellung im Parkhaus Züblin ist eröffnet!

Fumes and perfumes geht ins 6. Jahr!  

"Bauern helfen Bauern" in Bosnien
22.07.2019

Srebrenica - Nie überwundenes Trauma - Teil 2

Auf dem Weg nach Bosnien-Herzegowina

Wie ein Konflikt mitten in Europa eingefroren wurde.  

"Bauern helfen Bauern" in Bosnien
13.06.2019

Srebrenica - Nie überwundenes Trauma

Wie eine österreichische Hilfsorganisation in Bosnien Menschen hilft

Die Probleme in Bosnien sind schon lange nicht mehr auf der Tagesordnung europäischer Medien und Politiker.  

03.06.2019

Typo3 9.5, Extbase Models generiert im Frontend und sprechende URLs

Da ist sie, die schöne neue sprechende URL-Welt in TYPO3 9.5. Einfach ein Feld vom Typ 'slug' konfigurieren, und der Datensatz hat eine schöne, sprechende, SEO sichere URL. Außer, naja, außer der Datensatz wurde im Frontend, oder via Cron oder sonst irgendwie in der Extbase Welt generiert. Was tun?  

Arbeiten mit TYPO3 FlashMessages im FrontEnd
15.05.2019

FlashMessages in TYPO3 Frontend konfigurieren und nutzen

Arbeiten mit TYPO3 FlashMessages im FrontEnd

Man will schnell Meldungen im Frontend auf Interaktionen bringen? Man braucht das nur temporär? Es gibt ja die FlashMessages im Backend. Aber kann ich die auch im Frontend nutzen? Ja, ich kann. Und hier zeige ich, wie.  

Waldakademie Schramberg
27.03.2019

Waldakademie Schramberg mit neuem Programmheft

Erweiterung des Freizeitangebotes

Der langjährige Kunde unseres Partners B-FACTOR, das Familienerholungswerk der Diözese Rottenburg-Stuttgart, hat sein vielfältiges Ferien- und Freizeitangebot erweitert und am 15. März 2019 die Waldakademie Schramberg als neuen, wichtigen Bestandteil des Feriendorfs Schramberg feierlich eröffnet.  

Uploadfilter und Leistungsschutzrecht
26.03.2019

Uploadfilter und Leistungsschutzrecht

Worum geht es?

Jetzt ist sie durch: Die EU-Richtlinie zum "Urheberrecht im digitalen Binnenmarkt" ist vom Europäischen Parlament abgesegnet worden. 348 Abgeordnete waren dafür, 274 waren dagegen, 36 enthielten sich. Der Riss ging dabei durch alle Fraktionen. Besonders umstritten sind die Artikel 15 (früher 11) und 17 (früher 13).  

Globales Menü aus Datensätzen generiert
08.03.2019

Globales Menü aus Datensätzen generiert

Für eine Produktübersicht ergab sich die Notwendigkeit, ein immer vorhandenes Menü für die Webseite zu generieren.

Der erste Gedanke war, hier ein Plugin zu bauen, welches die Datensätze holt, aufbereitet und ausliefert, damit im Fluid Template das Menü generiert werden kann. Folgende Szenarien wären damit möglich gewesen:  

TYPO3 Extensions aktualisieren
26.02.2019

Hilfe, meine TYPO3 Extension ist zu alt!

Wie hält man seine TYPO3 Erweiterungen auf dem neuesten Stand?

Jeder der TYPO3 Extensions schreibt und diese über die Jahre pflegt, kommt irgendwann mal an die Stelle, wo die Extension zu alt ist für die glänzend neue TYPO3 Version.  

Uploadfilter
22.02.2019

Uploadfilter

Worum geht es?

Nach monatelangem Tauziehen steht fest: Die Europäische Union verpflichtet künftig Webseiten und Apps zum Filtern von Inhalten. Die Freiheit im Internet schwindet damit, fürchten Netzaktivisten. Am Text der Reform ist nicht mehr zu rütteln, die endgültige Abstimmung kommt in wenigen Wochen.  

Allgemeines Gleichbehandlungsgesetz
12.02.2019

Allgemeines Gleichbehandlungsgesetz

Auswirkungen des dritten Geschlechts „divers“ auf Arbeitgeber und Personalabteilungen in der Praxis

Seit Mitte Dezember ist in Deutschland ein Gesetz in Kraft, das offiziell ein drittes Geschlecht neben Mann und Frau bestätigt. Nach dem Gesetzentwurf wird dieses mit der Bezeichnung „divers“ betitelt. Welche Auswirkungen hat diese Anerkennung des dritten Geschlechts auf Arbeitgeber sowie Personalabteilungen im Besonderen?  

World Usability Day
12.11.2018

World Usability Day 2018

Der Wert von Usability bei der User Experience

Alljährlich findet in vielen Städten der Welt der World Usability Day statt. Es gibt jede Menge Seminare, Workshops und Konferenzen, die sich umfassend mit Themen und Fragen rund um Usability und User Experience auf verschiedenen Gebieten befassen. Unsere Mitarbeiter waren in Stuttgart und Wien auf Veranstaltungen.  

ePrivacy-Verordnung
05.11.2018

Die ePrivacy-Verordnung

Worum geht es?

Nach der Europäischen Datenschutzgrundverordnung (EU-DSGVO) droht nun der nächste Schlag. Die Diskussionen um die ePrivacy-Verordnung tragen zur bereits ohnehin bestehenden Verwirrung bei. Aber worum geht da eigentlich? Und ist das überhaupt neu?  

TYPO3-Baukastensystem
02.11.2018

Unser TYPO3-Baukastensystem

Ein hochleistungsfähiges Multi-Mandantensystem

Viele flächendeckend verteilte Unternehmen und Organisationen haben die Idee und den Anspruch ihren Unternehmenseinheiten ein standardisiertes Tool in einheitlichem Look & Feel zur Verfügung zu stellen, welche innerhalb eines vorgegebenen Rahmens eine größtmögliche Flexibilität an Contentproduktions- bzw. Darstellungsmöglichkeiten haben.  

Strichzeichnungen und Illustrationen
26.10.2018

Punkt, Punkt, Komma – Strich: Sudhaus7 und die Strichzeichnung

Illustrationen als weitere Brauzutat für den Meistertrunk

Illustrationen sind das sprichwörtliche Salz in der Suppe. Im Kontrast zur Fotografie verbreiten sie eine Aura des klassischen.  

Editieren von Datensätzen
16.10.2018

Editieren von Datensätzen im Backend-Modul

Erstellung eines Links zur Editieransicht im ViewHelper oder Controller

Die TYPO3-Dokumentation zum Setzen eines Links zur Editieransicht eines Datensatzes in TYPO3 8 und 9 ist im Moment noch veraltet. Ich zeige, wie dies in Backend-Modulen, die die genannten TYPO3-Versionen als Abhängigkeit haben, tatsächlich umgesetzt werden muss.  

Kommentare