try... catch en @

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Jelle -

Jelle -

16/01/2012 11:47:19
Quote Anchor link
Stel je voor je wilt reageren op een topic, je klikt op de reageren knop.

Je krijgt een view te zien met het veld om te reageren, je typt hier een paar dingen in en je submit.

Je gaat nu controleren op een veld (bijvoorbeeld dat je nog een captcha moet invullen)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
try{
    validate(captcha);
    showTopic();
}
catch(Exception $e){
    //iets fout gegaan dus foutmelding +
    showTopicReactForm($e->getMessage);
}

?>


Het is maar een voorbeeld wat misschien zou kunnen, maar ik weet ook niet echt hoe je het goed kan toepassen in MVC.
 
PHP hulp

PHP hulp

25/01/2025 19:36:33
 
Ozzie PHP

Ozzie PHP

16/01/2012 11:58:03
Quote Anchor link
Ah, oké... ik dacht dat je een soort validate functie bedoelde die alleen een foutmelding echoode, maar in de bovengenoemde opzet moet je telkens allerlei specifieke try en catch blokken maken.
 
Jelle -

Jelle -

16/01/2012 12:06:02
Quote Anchor link
Niet als je 1 form validator hebt die de afhandeling voor je hele formulier doet en daaruit een exception opbrengt als het niet goed is.
 
Ozzie PHP

Ozzie PHP

16/01/2012 12:13:12
Quote Anchor link
Nou, dat bedoelde ik dus... maar in mijn voorbeeldje... hoe komt ie dan weer terug bij toView() en showView()?
 
Jelle -

Jelle -

16/01/2012 12:24:44
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
try{
    $formvalidator->validate('form1'); //formulier validaten, dus $_POST['form1_name'] etc
    //geen exception dus het is gelukt

    showView('topic.php');
}
catch(InvalidFormException $e){
    toView($e->getMessage);
    showView('topic_react.php');
}

//je zou ook nog hier iets kunnen doen als je dat wilt

?>


Op die manier kun je toch mooi de juiste view weergeven?
Gewijzigd op 16/01/2012 12:25:29 door Jelle -
 
Ozzie PHP

Ozzie PHP

16/01/2012 12:42:44
Quote Anchor link
Ja oké... maar stel nu dat je dus slechts één groot try-catch blok hebt, wat dan? Dus de complete code van je website staat in 1 try blok, dan kun je die catch niet specifiek maken en dan kun je dus ook geen specifieke view (topic_react.php) aanroepen. Snap je wat ik bedoel?
 
Jelle -

Jelle -

16/01/2012 12:51:00
Quote Anchor link
Daarom wil je ook dit soort fouten op een lager niveau oplossen, zoals wouter al zei:
Scheiding tussen je technische en user-gerelateerde fouten, bij een sql fout kun je er vanuit gaan dat de pagina's er toch niet goed uit komen dus laat je een fout specifeiek pagina zien. Maar bij user gerelateerde fouten vang je die dus dichter bij de fout op (en niet helemaal in het grote overkoepelende try catch blok).

Je kunt honderden try catch blokken in elkaar hebben staan, als de eerste hem niet pakt, probeert de gene daarboven dit wel etc...
 
Ozzie PHP

Ozzie PHP

16/01/2012 13:06:40
Quote Anchor link
Hmmm, oké... maar wat is dan het voordeel om het via try-catch te doen ipv if-else? (op dit lagere niveau bedoel ik dan he)
 
Jelle -

Jelle -

16/01/2012 13:07:59
Quote Anchor link
Als je veel met objecten werkt en deze dingen laat valideren kunnen exceptions wellicht handiger zijn, in principe is er niet een "betere" keus het is meer een keuze wat de "mooiere" oplossing is.
 
Ozzie PHP

Ozzie PHP

16/01/2012 13:26:33
Quote Anchor link
Hmmm, oké... ik zal er eens over nadenken. Ben in ieder geval weer wat wijzer :)
 
Pieter Jansen

Pieter Jansen

16/01/2012 15:54:08
Quote Anchor link
Try catch blokken hoor je NIET over je hele website te gebruiken! Althans, niet :

try {
// hele website
} catch ( Exception $e) {}

Bij de eerste catch stopt de rest van je script namelijk compleet. Als die op de allereerste regel al een exception pakt, stopt de hele site tot er een catch blok gevonden wordt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

try {
    echo  "blah";
    throw new Exception("een exception");
    echo "wordt nooit getoond.. :(";    
}
catch (Exception $e) {
    print_r($e->getMessage());
    echo "Ga verder met iets?";
}

?>


Wat je over het algemeen doet trouwens is de try-catch-finally. De finally wordt hoe dan ook uitgevoerd dus er moet verder nergens website logica staan in catch blokken. Helaas voor PHP gebruikers is er geen finally die uitgevoerd wordt, wat ook logisch is gezien het feit dat PHP een script taal is. M.a.w. alles na de catch wordt toch proc. uitgevoerd.

Het is slim om alle specifieke exceptions apart af te vangen. Als je een object creert kun je dat het beste wrappen om een try-catch blok. Op die manier vang je alle exceptions die door dat object gegooid kunnen worden. Wat ook helpt is onder elke class een <class>Exception te zetten en die exceptions te gooien in je bron class.

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
<?php

class Application {
    // je logic voor deze class of zo
}

class ApplicationException extends Exception {
   // origineel heeft een exception 3 params, $message, $line en $previous
   // maar voor dit voorbeeldje maakt het niet echt uit of wel :)

   public function __construct($message){
     parent::__construct($message);
   }
}

?>
Gewijzigd op 16/01/2012 15:54:42 door Pieter Jansen
 
Ozzie PHP

Ozzie PHP

16/01/2012 16:25:49
Quote Anchor link
Merijn, dankjewel voor je toelichting... maar de heren hiervoor zeggen dat je wel je hele website in een try-catch kan zetten. Nu weet ik het niet meer :-s
 
- Ariën  -
Beheerder

- Ariën -

16/01/2012 16:31:14
Quote Anchor link
Maar de bedoeling is toch vaak dat je script stopt bij een exception?

Volgens mij is het net gewoon wat het makkelijkste uit komt, en is beiden niet verkeerd?
Gewijzigd op 16/01/2012 16:32:37 door - Ariën -
 
Jelle -

Jelle -

16/01/2012 16:39:55
Quote Anchor link
Volgens mij wil je ook dat je script stopt met uitvoeren op het moment dat er een DB fout optreedt. Die handel je af (log/mail) en dan toon je een foutpagina die niet db afhankelijk is.
 
Pieter Jansen

Pieter Jansen

16/01/2012 17:07:12
Quote Anchor link
Ja als je wil dat je hele website stopt met functioneren als er een DB exception gegooid wordt, doe je dat in de afhandeling van je DBException. Maar exceptions kunnen ook gebruikt worden voor standaard errors, zoals: een query die uitgevoerd wordt maar waar geen resultaten worden getoond. Moet je hele website stoppen met functioneren omdat er geen resultaten werden gevonden?

Het hele idee van exceptions is dat je dat als je standaard debug tool gebruikt. Als er een CriticalDatabaseException gegooid wordt en die catch je, kun je stoppen met je website script, maar als er een NoResultException gegooid wordt, ga je door.

Een try catch op je hele website is erg slecht om de volgende reden:

De allereerste exception die gevonden wordt zorgt ervoor dat je hele website stopt met functioneren. Dat kan nooit de bedoeling zijn, kijk eens naar error_reporting, daar stopt het script ook pas als er een fatal error plaats vindt. Een notice of mysql_error killt je site niet.

Daarom is de regel dus dat je alles wat errors gaan gooien, je die ook specifiek daar afhandelt. try catch is niet een easy way out of error reporting om het maar zo te noemen.
 
Ozzie PHP

Ozzie PHP

16/01/2012 18:02:54
Quote Anchor link
"Maar exceptions kunnen ook gebruikt worden voor standaard errors, zoals: een query die uitgevoerd wordt maar waar geen resultaten worden getoond."

Bedoel je dat er geen resultaten gevonden worden? Maar dat zou toch gewoon kunnen als het betreffende resultaat niet in de database voorkomt? Moet je daar dan een exception voor throwen?
 
Pieter Jansen

Pieter Jansen

16/01/2012 18:11:27
Quote Anchor link
Moeten? Nee natuurlijk niet, sterker je wil zo weinig mogelijk exceptions gaan gebruiken, meer betekent meer exception handling. Misschien een slecht voorbeeld maar illustreert wel precies wat ik bedoel. Niet elke exception hoeft je app te killen. Er hoort een duidelijke onderscheiding gemaakt te worden. De kritieke errors of exceptions kun je gebruiken om je app te killen, de rest hoor je netjes af te vangen en in een log bij te gaan houden. Wat je er mee doet is aan jou natuurlijk.

Een try catch om je hele code wrappen is wel mogelijk, maar niet raadzaam, zoals met alles ligt het aan scope. Je kunt try catch blokken ook nesten binnen een try, dan wordt het geneste try blok eerst doorlopen en eventuele exceptions in de geneste catch gevangen. De root try catch pakt dan alle onafgehandelde exceptions op en killt nog steeds je app als je niet oplet.

Het nadeel van de globale manier is dat je totaal niet weet waar iets mis gaat, dus loggen en debuggen heeft geen zin op die manier, dan kun je net zo goed niet met exceptions gaan werken.
 
Ozzie PHP

Ozzie PHP

16/01/2012 18:14:39
Quote Anchor link
"Het nadeel van de globale manier is dat je totaal niet weet waar iets mis gaat"

Waarom niet? Je kunt toch nog steeds de exception gegevens opvragen?
 
Kris Peeters

Kris Peeters

16/01/2012 18:35:27
Quote Anchor link
Is dat niet een beetje met een kanon op een mug schieten?

Mijn idee is: zorg dat je weet welk wapen je tegen welke vijand gebruikt.

Nu; ik ben een C/c++/C# mens. misschien wordt try/catch in andere talen wel gemakkelijker gebruikt over een hele applicatie. In dat geval ... doe vooral waar je je gemakkelijk mee voelt.

Kijk ook eens hier:
http://www.phphulp.nl/php/tutorial/data-verwerking/foutafhandeling-in-php-error-handling/571/
Deze tutorial toont je hoe je fouten opvangt die normaal gezien op het scherm zouden worden getoond.
 
Pieter Jansen

Pieter Jansen

16/01/2012 18:54:13
Quote Anchor link
@Ozzie, omdat dat juist je hele applicatie in de war schopt. Dat betekent dat er <xxx> aan code niet wordt uitgevoerd om uiteindelijk bij een generieke exception te komen. Die kun je wel uitlezen maar eigenlijk weet je nog steeds niet precies wat er mis gaat. Als je voor Exceptions kiest, moet je ook de moeite nemen om ze goed af te handelen. Niets is zo vervelend om exceptions op te gaan lossen zonder te weten waar je moet zijn.

@Kris, ik heb mijn achtergrond in Java en daar werkt het voortreffelijk, het is de meest gebruikte manier van foutafhandeling en daar wordt het heel anders gebruikt in PHP. Maar ook in Java ( net als in C# etc) wordt het niet over een hele applicatie gebruikt. Bovendien is je entrypoint van belang.

Dus kies je voor exceptions, dan hoor je het goed te gaan gebruiken. niets zo vervelend als bijvoorbeeld:

try {
// code
} catch {}

of

try {
// er wordt een StreamNotFoundException gegooid
} catch (Exception e){
e.getMessage();
}

in beide gevallen sla je de plank mis. En de laatste is niet zo erg, mits je de gewone exceptions als fallback hanteert, dus:

catch ( StreamNotFoundException e){ /* handel je code af */ }
catch ( FileNotFoundException e) { /* handel je code af */ }
catch ( Exception e){ /* handel je code af */ }
 

Pagina: « vorige 1 2 3 volgende »



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.