exception classes

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

PHP Developer

Zie jij mogelijkheden om onze tooling technisch te verbeteren en uit te bouwen? Over Jobmatix Jobmatix is een innovatieve en internationale speler op het gebied van jobmarketing. Onze jobmarketing automation tool helpt organisaties bij het aantrekken van nieuw talent door vacatures digitaal, geautomatiseerd en op een efficiënte manier te adverteren en onder de aandacht te brengen bij de doelgroep op 25+ jobboards. Volledig performance-based, waarbij organisaties betalen op basis van cost per click of cost per applicant. Maandelijks wordt onze jobmarketing automation tool al gebruikt door vele directe werkgevers, intermediairs en mediabureaus, waaronder Picnic, Rijkswaterstaat, AdverOnline, Schiphol, DPA, Teleperformance en

Bekijk vacature »

Fullstack Webdeveloper .NET Azure Big Data SaaS

Bedrijfsomschrijving Deze klant van ons is recentelijk onderdeel geworden van een grote moederorganisatie, ze zijn dé partij als het gaat om software maken voor ambitieuze ondernemers, ze maken maatwerk software. Vanuit het fantastisch vormgegeven hightech gebouw te Rotterdam centrum werken ze met zo'n 40 medewerkers aan hoogwaardige software gericht op financiële data, betaalinformatie, maar ook backoffice software. De software wordt webbased, desktop en mobile aangeboden en er worden zeer moderne ontwikkeltechnieken toegepast. Je moet dan denken aan patroonherkenning, Big Data, Machine Learning en OCR. Als Developer, ongeacht je niveau, ga je hier te maken krijgen met de allerleukste kant van

Bekijk vacature »

Medior/Senior Software Developers gezocht in de Ra

Functie Op dit moment staan er posities open voor de volgende functies: Front-end, Back-End & Fullstack software developer. Als Front-End software developer werk je met JavaScript en de bijbehorende technologieën zoals TypeScript, Angular, React, Vue en Svelte. Als Back-End software developer ben je bezig in NodeJS en doe je dit met behulp van AWS, NoSQL, REST en GraphQL. Je krijgt leuke en uitdagende opdrachten met een gemiddelde duur van anderhalf jaar. Hier werk je in een team met andere IT’ers aan het ontwikkelen en verbeteren van software. Je wordt begeleid door een accountmanager die fungeert als jouw aanspreekpunt. Het team

Bekijk vacature »

Medior Mobile Developer iOS Amsterdam

Functie What will you be doing as Mobile Developer? As an iOS app developer you will work in a multidisciplinary team of app developers, web developers and designers. You will work on world-class apps that will be used by thousands of people. There is a lot of room for self-development on a technical and personal level. Together with the rest of the team you develop in the newest techniques and you go for the best quality. We work with Kotlin Multiplatform Mobile to develop hybrid apps and we guarantee quality with peer reviews, unit testing and we use a CI/CD.

Bekijk vacature »

Developer Full Stack

Functie omschrijving Full Stack Developer gezocht! Wij zijn op zoek naar een Full Stack Developer voor een bedrijf in de regio Nijkerk. Je maakt in deze functie onderdeel uit van een groeiend team met een goede ambitie waarbij eenheid, betrokken en overtreffen de belangrijkste kernwaardes zijn. Het bedrijf werkt volgens de AGILE/SCRUM methode, wat je o.a. terug vindt in de tweewekelijkse sprints, retrospectives en een daily standup. Je takenpakket bestaat uit: Bijdragen aan het door ontwikkelen, onderhouden en optimaliseren van een Saas applicatie; Bijdragen aan de innovatie van het bedrijf en hun klanten; Het ontwikkelen op de laatste technologie van

Bekijk vacature »

T-SQL Database developer

Functie omschrijving Ben jij een ETL database specialist? Houd jij ervan om te puzzelen met Databases, Query's & Stored procedures? Zoek jij uitdaging, vrijheid en verantwoordelijkheid? Zoek dan niet verder! Wij zijn per direct op zoek naar medior en senior database developers. Je gaat werken voor een relatief klein softwarebedrijf in omgeving Tilburg. Samen met 12 collega's (allemaal techneuten), ga jij je bezig houden met het bouwen en/of onderhouden van database software. Deze software wordt internationaal ingezet voor het automatiseren van logistieke processen. Jouw werkzaamheden gaan er als volgt uit zien: Je bent in een klein team met developers, verantwoordelijk

Bekijk vacature »

Back-end programmeur

Functieomschrijving Heb jij kort geleden je MBO of HBO ICT in ontvangst mogen nemen? Of ben je klaar voor een nieuw hoofdstuk in jouw carrière? Voor een uitdagende werkgever in de regio van Tilburg zijn wij op zoek naar een ambitieuze back-end programmeur met affiniteit met MS Acess. Samen met een enthousiast team ben je verantwoordelijk voor het bouwen van maatwerk software voor hun klanten. Je hebt kennis of ervaring van SQL, Maar affiniteit met MS Acess is nog belangrijker. Je bent sociaal naar klanten en flexibel ingesteld. Je denkt altijd in kansen en gaat graag de uitdaging aan. Verder

Bekijk vacature »

Java developer

Als Java Developer bij Sogeti ben je onderdeel van onze toonaangevende community die bestaat uit ruim 100 gepassioneerde professionals. In teamverband lever je mooie prestaties. Daarmee draag je aan bij de meerwaarde die wij leveren aan onze klanten. Geen werkdag is hetzelfde, je bent voortdurend bezig met het oplossen van allerlei complexe vraagstukken binnen bedrijfskritische systemen. Een voorbeeld hiervan is een cliënt-volgsysteem bij Reclassering Nederland. Andere klanten waar wij onder andere voor werken: KPN, Philips, Nationale-Nederlanden, Kamer van Koophandel, ABN AMRO, Bovemij, Arval en de Politie. Werken bij Sogeti Nieuwe ontwikkelingen volgen we op de voet en delen we binnen de

Bekijk vacature »

Integratie Developer / Architect

Dit ga je doen Als Integratie Developer / Architect binnen deze organisatie krijg je echt de kans om impact te maken. De organisatie is groeiende maar houdt een corporate cultuur buiten de deur. Heb je een goede business case: zorg voor goede argumentatie en ga ervoor! Geen stroperig beslissingsproces dat jouw ideeën in de weg staat! Enkele van jouw taken: Je ontwerpt en ontwikkelt nieuwe integraties met behulp van interne tools (Boomi) of externe partners; Je vertaalt functionele specificaties naar technische oplossingen; Je denkt mee over strategische ontwikkelingen op het gebied van applicatie integratie; Je voert regie op leveranciers en

Bekijk vacature »

C# .NET Developer IoT SQL Server

Samengevat: Wij ontwikkelen innovatieve oplossingen om apparaten en bezittingen op een eenvoudige en flexibele manier te beveiligen. Ben jij een C# .NET developer? Heb jij ervaring met C# en SQL server? Vaste baan: C# .NET Developer IoT HBO €3.200 - €4.500 Deze werkgever is gespecialiseerd in hoogwaardige GSM/GPRS alarm- en telemetrietechnologie. Met een eigen productlijn en klantspecifieke ontwikkelingen biedt deze werkgever oplossingen om op afstand te meten, melden, loggen en aansturen, ook op plaatsen zonder stroomvoorziening. Onze producten worden gekarakteriseerd door flexibiliteit in de configuratie, betrouwbaarheid en een extreem laag stroomverbruik. Zij werken voor MKB klanten. Deze werkgever heeft veel

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

Bekijk vacature »

Embedded Software Developer

Functie omschrijving Voor een mooi softwarebedrijf in omgeving Moordrecht zijn wij op zoek naar een Embedded Software developer. Ben jij enthousiast en een echte team player? Lees dan snel of dit iets voor jou is! Binnen deze rol houdt jij je bezig met alle werkzaamheden die nodig zijn om een functionaliteit te bouwen. Denk aan ontwerpen, architectuur, programmeren en algoritmes. Je voert test en validatie werkzaamheden uit bij de implementatie bij de klant. Ben jij een Embedded Software Developer die affiniteit heeft met de allernieuwste technieken? Laat dan snel wat van je horen! Bedrijfsprofiel Onze opdrachtgever bestaat uit een groot

Bekijk vacature »

Java Developer

Java/Kotlin Developer Ben jij een ervaren Java/Kotlin developer met een passie voor het automatiseren van bedrijfsprocessen? Wil je graag deelnemen aan uitdagende projecten bij aansprekende klanten? En ben je op zoek naar een professioneel, ambitieus en dynamisch bedrijf om je carrière verder te ontwikkelen? Kom dan ons team bij Ritense in Amsterdam versterken! Zo ziet de functie eruit: Als Java/Kotlin developer bij Ritense ben je verantwoordelijk voor de ontwikkeling en implementatie van applicaties die bedrijfsprocessen automatiseren, zodat onze klanten slimmer, efficiënter en klantgerichter kunnen werken. Als developer ben je in de lead en zorg je voor de correcte oplevering van

Bekijk vacature »

.NET Developer

Dit ga je doen (Door)Ontwikkelen van het applicatielandschap; (Door)Ontwikkelen van microservices; Bouwen van nieuwe functionaliteiten; Verbeteringen aandragen voor het applicatielandschap; Sparren met de business. Hier ga je werken De organisatie is werkzaam in de financiële dienstverlening met meer dan 200 medewerkers en meer dan 250.000 eindgebruikers is het een van de grotere binnen haar branche. Je komt te werken in een team waarmee je verantwoordelijk bent voor het ontwikkelen en onderhouden van de financiële applicaties binnen de organisatie, denk hierbij aan het bouwen en onderhouden van portalen. Als .net developer ga jij het development team ondersteunen met de transitie naar

Bekijk vacature »

Software Developer PHP JavaScript Python HBO SQL

Samengevat: Wij zijn een softwarebedrijf voor Autodealers. Ben jij een Medior of Senior Software Developer? Heb je ervaring met PHP, JavaScript of Python? Vaste baan: Java.Developer Software HBO €3.000 - €5.200 Bij ons op de werkvloer is er een positieve en informele sfeer. Naast een goede begeleiding en een enthousiaste klantenkring biedt deze werkgever een prettige omgeving met zeer afwisselende werkzaamheden. Houd jij van aanpakken en denk je dat je deze uitdaging aankunt? Dan zoeken wij jou! Zij werken voor grote klanten. Zij doen omvangrijke projecten die we bij deze werkgever op kantoor realiseren (geen detachering). Zij werken met state-of-the-art

Bekijk vacature »

Pagina: 1 2 3 volgende »

Ozzie PHP

Ozzie PHP

16/11/2013 01:35:09
Quote Anchor link
Ola peepz,

Nog even een vraagje over eigen exception classes.

Mij werd dus aangeraden om eigen exception classes te gebruiken. Nu zien die classes er allemaal ongeveer zo uit:

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

namespace Foo;

use Bar\MyException;

class Exception extends MyException {

    public function __construct($message, $code, $previous = null) {
      parent::__construct($message, $code, $previous);
   }

}

?>

Nu is het zo dat de MyException class een constructor heeft die identiek is aan de constructor van de Foo Exception class. De constructor in de Foo Exception class levert op dit moment dus geen meerwaarde en zou ik dus compleet achterwege kunnen laten. (Hierbij ga ik er nu even vanuit dat ik de $message niet wil aanpassen met een of andere standaardtekst.)

Als ik de constructor zou weglaten, krijg ik als het ware een lege class. Is dat niet vreemd? Of is dit gewoon oké?

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

namespace Foo;

use Bar\MyException;

class Exception extends MyException {}

?>
Gewijzigd op 16/11/2013 01:37:32 door Ozzie PHP
 
PHP hulp

PHP hulp

24/11/2024 05:06:43
 
Wouter J

Wouter J

16/11/2013 01:53:05
Quote Anchor link
Nee, dat is niet vreemd. Dat is zlefs zzeer normaal... overigens lijkt je code nu niet helemaal te kloppen...
 
Ozzie PHP

Ozzie PHP

16/11/2013 02:44:31
Quote Anchor link
Haha, Woutertje nog laat wakker :)

>> Nee, dat is niet vreemd. Dat is zlefs zzeer normaal...
Ah oke... dus een lege class is normaal :D

Offtopic:

>> overigens lijkt je code nu niet helemaal te kloppen...

Sorry... ik heb een paar biertjes teveel op... wat klopt er volgens jou niet?
Gewijzigd op 16/11/2013 02:50:50 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

16/11/2013 19:14:38
Quote Anchor link
Je zou wat aan de naamgeving kunnen doen. Dit is onlogisch:

class Exception extends MyException() {}

Er is al een standaardklasse Exception, dus als je van "generiek" naar "specifiek" werkt, is het eerder:

class MyException() extends \Exception() {}

Anders moet je raden of je Exception gebruikt uit de namespace of \Exception van PHP.

Tweede punt: van lege klassen die een kloon zijn van andere klassen, ben ik geen voorstander. Ja, ze zijn prachtig voor @todo-lijsten. Maar het zijn ook luchtkastelen. En lege koffers die je blijft meezeulen omdat je "ooit" bedacht hebt dat ze "later misschien" van pas komen.
 
Wouter J

Wouter J

16/11/2013 19:19:14
Quote Anchor link
Lege klassen zijn niet goed, behalve bij exception klassen. De exceptions wil je namelijk kunnen onderscheiden van elkaar, doormiddel van hun klasse. De exceptions hebben echter allemaal vaak alleen de functies die de base exception class ook heeft.
 
Ward van der Put
Moderator

Ward van der Put

16/11/2013 19:48:16
Quote Anchor link
Wouter J op 16/11/2013 19:19:14:
Lege klassen zijn niet goed, behalve bij exception klassen. De exceptions wil je namelijk kunnen onderscheiden van elkaar, doormiddel van hun klasse. De exceptions hebben echter allemaal vaak alleen de functies die de base exception class ook heeft.

Dat ben ik deels met je eens, maar daarmee kies je binnen de exception-hiërarchie automatisch voor de specifieke plaats van een exception in het grotere geheel. Bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
class ServiceException extends \Exception {}
class DatabaseException extends ServiceException {}
?>

Die opzet bevat al impliciet een expliciete keuze: de databasehandler is een service. Je kúnt die keuze inderdaad maken, maar besef dan dat het een ontwerpbeslissing is die consequenties voor de rest heeft. En voor later.

Via de exceptions doe je dus eigenlijk aan class type hinting. Alleen komt dat niet tot uitdrukking in de klassen zelf, waar je dat verwacht, maar alleen in de exceptions.

Als je andere exceptions slechts gebruikt om "ze van elkaar te kunnen onderscheiden", krijg je trouwens nog iets dat je sowieso niet wilt: dan heeft elke klasse een eigen exception-klasse. Dan heeft class Foo een FooException en class Bar een BarException. Het kán, maar de vraag is of je dat moet willen.
 
Ozzie PHP

Ozzie PHP

16/11/2013 21:27:22
Quote Anchor link
>> Lege klassen zijn niet goed, behalve bij exception klassen. De exceptions wil je namelijk kunnen onderscheiden van elkaar, doormiddel van hun klasse. De exceptions hebben echter allemaal vaak alleen de functies die de base exception class ook heeft.

Dit is inderdaad hoe ik het nu ook heb. De exceptions zijn allemaal hetzelfde, maar je wilt ze inderdaad kunnen onderscheiden zodat je ze in een catch-blok afzonderlijk kunt opvangen en afhandelen. Gevolg is dat je dan lege classes krijgt, maar als dat bij Exceptions gebruikelijk is dan zal ik het maar zo laten.

>> Als je andere exceptions slechts gebruikt om "ze van elkaar te kunnen onderscheiden", krijg je trouwens nog iets dat je sowieso niet wilt: dan heeft elke klasse een eigen exception-klasse.

Dit is wel wat ik nu in feite doe.

>> Je zou wat aan de naamgeving kunnen doen. Dit is onlogisch:

class Exception extends MyException() {}

Euh, niet helemaal. Die MyException moet je zien als mijn eigen base Exception. En als je goed kijkt dan zie je dat de namespace Foo is. Het is dus niet een normale Exception, maar een FooException. Eigenlijk is het dus dit:

class FooException extends BaseException() {}


Wouter J op 16/11/2013 01:53:05:
Nee, dat is niet vreemd. Dat is zlefs zzeer normaal... overigens lijkt je code nu niet helemaal te kloppen...

Wat klopt er niet?
 
Ward van der Put
Moderator

Ward van der Put

17/11/2013 09:13:21
Quote Anchor link
Je kunt inderdaad dit onderscheid maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
class DatabaseException extends \Exception() {}
class ConnectionException extends DatabaseException() {}
?>

Dan kun je in een klasse dit doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($this->connect_error) {
    throw new \ConnectionException();
}

?>

Fijn, nu weet je dat er een ConnectionException optreedt. En ook dat dit een database-exception moet zijn, en geen andere verbindingsfout, want zo hadden we de exception-hiërarchie gedefinieerd.

Alleen... voor het type fout heb je helemaal geen apart type exception nodig. Het kan ook zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if ($this->connect_error) {
    throw new \Exception(
        'Connect error (' . $this->connect_errno . '): ' . $this->connect_error,
        $this->connect_errno
    );
}

?>

Met deze standaard-exception zie je toch veel meer: benut de mogelijkheid om foutmeldingen én foutcodes door te geven.

Tweede punt is dat de rek er al gauw uit is. Stel dat "Too many connections" de meest voorkomende verbindingsfout is. Dan zou je de hiërarchie verder kunnen extenden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
class DatabaseException extends \Exception() {}
class ConnectionException extends DatabaseException() {}
class TooManyConnectionsException extends ConnectionException() {}
?>

Als je weet wat er allemaal fout kan gaan, is duidelijk dat het onzinnig is om honderden exceptions te maken. Gebruik dan een duidelijke melding met een unieke code.
Gewijzigd op 17/11/2013 09:14:45 door Ward van der Put
 
Dos Moonen

Dos Moonen

17/11/2013 09:40:16
Quote Anchor link
Ward van der Put op 17/11/2013 09:13:21:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($this->connect_error) {
    throw new \ConnectionException();
}

?>

Fijn, nu weet je dat er een ConnectionException optreedt. En ook dat dit een database-exception moet zijn, en geen andere verbindingsfout, want zo hadden we de exception-hiërarchie gedefinieerd.

Alleen... voor het type fout heb je helemaal geen apart type exception nodig. Het kan ook zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if ($this->connect_error) {
    throw new \Exception(
        'Connect error (' . $this->connect_errno . '): ' . $this->connect_error,
        $this->connect_errno
    );
}

?>

Met deze standaard-exception zie je toch veel meer: benut de mogelijkheid om foutmeldingen én foutcodes door te geven.

In log files wel ja. Maar nu zou ik met stripos() aan de gang moeten om iets alleen uit te voeren bij een connectie fout.

Ward van der Put op 17/11/2013 09:13:21:
Tweede punt is dat de rek er al gauw uit is. Stel dat "Too many connections" de meest voorkomende verbindingsfout is. Dan zou je de hiërarchie verder kunnen extenden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
class DatabaseException extends \Exception() {}
class ConnectionException extends DatabaseException() {}
class TooManyConnectionsException extends ConnectionException() {}
?>

Als je weet wat er allemaal fout kan gaan, is duidelijk dat het onzinnig is om honderden exceptions te maken. Gebruik dan een duidelijke melding met een unieke code.

Je moet het inderdaad niet gaan overdrijven. Een combinatie van error nummers met een exception class die specifiek genoeg is om te kunnen bepalen wat het nummer betekend is vaak toch wel de lijn die je niet voorbij wilt gaan.
 
Wouter J

Wouter J

17/11/2013 13:38:18
Quote Anchor link
Ward, nummers kun je niet gebruiken om alleen sommige exceptions te catchen. Wanneer je dus onderscheidt wil maken bij het catchen gebruik je een andere exception klasse. In jou geval zou ik bijv. onderscheid maken tussen database connection exceptions en database no results found exception. Echter binnen de connection exceptions wil je het verschil niet apart catchen. Ik ga niet alleen de TooManyConnections exception catchen, maar niet de NoAccess exception. Dat onderscheid bouw je dus in met exception nummers (waar natuurlijk een mooie class constante aan hangt) en messages.
 
Ozzie PHP

Ozzie PHP

17/11/2013 14:14:35
Quote Anchor link
Mijn idee is om niet om dit te doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
class DatabaseException extends \Exception() {}
class ConnectionException extends DatabaseException() {}
?>

Maar eerder zoiets als dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
class DatabaseException extends MyBaseException {}
class DatabaseConnectionException extends MyBaseException {}
?>

Ik breng dus juist geen hiërarchie aan. Nu staat iedere exception op zichzelf. Op het moment dat een exception wordt gegooid kan ik deze dus "per stuk" afvangen en een eigen afhandeling geven.

Stel dat ik bijv. dit zou doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
class ConnectionException extends DatabaseException() {}
class NoDataException extends DatabaseException() {}
?>

... dan zou als ik ergens een DatabaseException opvang, de afhandeling voor een niet werkende connectie (situatie 1) en het niet verkrijgen van data (situatie 2) hetzelfde worden afgehandeld. Situatie 2 kan echter in de praktijk gewoon voorkomen zonder dat dit een ernstige fout hoeft te zijn. Situatie 1 is echter een ander geval. Als ik geen connectie met de database kan maken moeten alle alarmbellen afgaan en moet ik actie ondernemen.

Is mijn gedachtengang correct?

Quote:
Alleen... voor het type fout heb je helemaal geen apart type exception nodig. Het kan ook zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if ($this->connect_error) {
    throw new \Exception(
        'Connect error (' . $this->connect_errno . '): ' . $this->connect_error,
        $this->connect_errno
    );
}

?>

Maar Ward, dan ondermijn je denk ik het principe van Exceptions. De Exception class zelf weet nu, aan de hand van de $message, om wat voor error het gaat. Echter, de buitenwereld heeft geen idee. Op deze manier kun je alleen een algemene exception opvangen in een catch-blok, die altijd op dezelfde manier wordt afgehandeld. Maar wat je wil is toch dat FooException op manier A wordt afgehandeld, en BarExceptopn op manier B, enz. Door slechts 1 Exception class te gebruiken haal je dit principe geheel onderuit.
Gewijzigd op 17/11/2013 14:16:43 door Ozzie PHP
 
Wouter J

Wouter J

17/11/2013 14:45:40
Quote Anchor link
>> dan zou als ik ergens een DatabaseException opvang, de afhandeling voor een niet werkende connectie (situatie 1) en het niet verkrijgen van data (situatie 2) hetzelfde worden afgehandeld. Situatie 2 kan echter in de praktijk gewoon voorkomen zonder dat dit een ernstige fout hoeft te zijn. Situatie 1 is echter een ander geval. Als ik geen connectie met de database kan maken moeten alle alarmbellen afgaan en moet ik actie ondernemen.

En dat is juist het mooie van het gebruik van hierarchy. In sommige gevallen wil je gewoon alle database problemen, of zelfs alle problemen, op vangen, terwijl je in andere gevallen alleen de connectie problemen wil opvangen. Het gebruik van hierarchy is juist het mooie van exceptions, gooi je dat weg kan je lekker alleen met een base klasse gaan werken...

En voor die laatste alinea, lees eens mijn reactie. Overal een exception klasse voor maken is onzin (vooral als je geen hierarcy gebruikt,..)
 
Ward van der Put
Moderator

Ward van der Put

17/11/2013 14:57:10
Quote Anchor link
Ik gaf bewust voorbeelden van de twee uitersten: elke fout afhandelen met een eigen exception enerzijds of alles met dezelfde exception-klasse afhandelen. Dan is namelijk duidelijk waarover we het wel eens zijn: tussen die twee uitersten zul je een middenweg moeten vinden :-)

Een class Foo voorzien van een FooException, een class Bar van een BarException, enzovoort kán inderdaad een oplossing zijn voor klasse-specifieke fouten. Maar er zijn ook universele fouten die niet klasse-gebonden zijn. Neem bijvoorbeeld een fout van het type "ongeldig datatype" of een fout uit de categorie "waarde te groot/klein".

Een voorbeeld... iDEAL vereist een bedrag in centen (een integer) tussen 84 en 1000000. Toch vind ik het opgeven van iets anders dan een integer geen iDEAL-specifieke iDEALException waard. Het is een veel universelere fout: deze methode verwacht een integer, maar er kwam iets anders binnen.

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
<?php
/**
 * @api
 * @param int $amount An iDEAL amount in cents.
 * @return this
 * @throws \InvalidArgumentException if the amount is not an integer.
 * @throws \RangeException if the amount is too small or too large.
 */

public function setAmount($amount)
{

    $amount = filter_var($amount, FILTER_VALIDATE_INT);
    if ($amount === false) {
        throw new \InvalidArgumentException('The iDEAL amount is not an integer.');
    }
elseif ($amount < 84) {
        throw new \RangeException('The iDEAL amount is too small.');
    }
elseif ($amount > 1000000) {
        throw new \RangeException('The iDEAL amount is too large.');
    }
else {
        $this->Amount = $amount;
    }

    return $this;
}

?>
 
Wouter J

Wouter J

17/11/2013 15:01:30
Quote Anchor link
Ward, in dat geval zal ik alsnog een Ideal\RangeException en Ideal\InvalidArgumentException maken.
 
Ozzie PHP

Ozzie PHP

17/11/2013 15:06:23
Quote Anchor link
Oké... weer even terug naar de basis dan...

Stel ik heb bijv. deze situatie:

class A probeert iets te cachen en gebruikt hiervoor de cacher (class C). Deze cacher gebruikt op haar beurt weer een FileSystem class (class F) om het bestand op te slaan. Dus:

class A -> class C -> class F

Als een bestand niet kan worden weggeschreven gooit class F een FileSystem exception. Vervolgens gooit class C een Cacher exception. Class A controleert vervolgens in het catch-blok of er een Cacher exception is gegooid. Kan ik nu dan ook net zo goed in plaats van een FileSystem exception en een Cacher exception gewoon 2x een algemene exception gooien? En in class A controleren of er een algemene Exception is gegooid?
 
Ward van der Put
Moderator

Ward van der Put

17/11/2013 15:19:44
Quote Anchor link
Wouter J op 17/11/2013 15:01:30:
Ward, in dat geval zal ik alsnog een Ideal\RangeException en Ideal\InvalidArgumentException maken.

Betaalmethoden extenden hetzelfde request-object voor de API van een betaalprovider en hebben allemaal een setAmount()-methode. Ik heb daarmee zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
namespace TargetPay;

use TargetPay\Request as Request;
  
final class iDEAL extends Request
{
    public method setAmount($amount)
    {

        // throw new ... ?
    }
}

?>

Waar zou jij de grens voor wel/geen unieke exception dan leggen? Bij de namespace? De Request-ouderklasse? Of toch de iDEAL-klasse? Of misschien alles een kwartslag draaien en een InvalidAmountException opvoeren voor alle betaalsystemen?
Gewijzigd op 17/11/2013 15:20:09 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

17/11/2013 15:30:37
Quote Anchor link
Ward, kun je ook nog ff reageren op mijn vraag...
 
Ward van der Put
Moderator

Ward van der Put

17/11/2013 15:36:17
Quote Anchor link
Ozzie PHP op 17/11/2013 15:30:37:
Ward, kun je ook nog ff reageren op mijn vraag...

Ja, ik wil hier een CacherException zien. Dat de Cacher het FileSystem gebruikt, is niet relevant. Een verbeterde Cacher 2.0.0 kan een andere store gebruiken: het RAM-geheugen, een database, de cloud. Maar daarvan mogen "derden" die de Cacher inzetten geen last hebben. Ze hoeven het niet eens te weten.

Overigens kun je uit een trace altijd nog afleiden waar die CacherException vandaan komt als je gaat debuggen.
 
Wouter J

Wouter J

17/11/2013 15:38:10
Quote Anchor link
>> Waar zou jij de grens voor wel/geen unieke exception dan leggen? Bij de namespace? De Request-ouderklasse? Of toch de iDEAL-klasse? Of misschien alles een kwartslag draaien en een InvalidAmountException opvoeren voor alle betaalsystemen?

Ik zou inderdaad niet per klasse is specifieks doen, behalve als het specifiek is voor die betaalmethode. Globaal kun je je code altijd indelen in verschillende componenten: Router, Validation, Form, etc. Deze component hebben allemaal hun eigen exceptions.

Ik zou dus een TargetPay\Exception\InvalidAmountException maken. Over het algemeen moeten alle children van een klasse dezelfde exceptions gebruiken, aangezien je ongemerkt de klasse moet kunnen veranderen.

Toevoeging op 17/11/2013 15:40:07:

>> Vervolgens gooit class C een Cacher exception. Class A controleert vervolgens in het catch-blok of er een Cacher exception is gegooid. Kan ik nu dan ook net zo goed in plaats van een FileSystem exception en een Cacher exception gewoon 2x een algemene exception gooien? En in class A controleren of er een algemene Exception is gegooid?

Nee, geen algemene exceptions. De Class A zal echter alleen een Cacher exception willen ontvangen (met als previous exception de FileSystemException). Het zal me een worst wezen wat die cacher heeft gedaan waardoor het niet lukte, dat heb ik alleen nodig bij het debuggen. Voor de code wil ik alleen weten dat die Cacher het niet is gelukt.
 
Ozzie PHP

Ozzie PHP

17/11/2013 15:40:52
Quote Anchor link
>> Ja, ik wil hier een CacherException zien. Dat de Cacher het FileSystem gebruikt, is niet relevant. Een verbeterde Cacher 2.0.0 kan een andere store gebruiken: het RAM-geheugen, een database, de cloud. Maar daarvan mogen "derden" die de Cacher inzetten geen last hebben. Ze hoeven het niet eens te weten.

Dus mijn opzet zoals ik die nu heb die klopt dan gewoon?
 
Ward van der Put
Moderator

Ward van der Put

17/11/2013 15:44:46
Quote Anchor link
Dank je Wouter! Ik ga het gelijk verbouwen.
 

Pagina: 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.