exception classes

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Medior/Senior Python developer (Django)

Functie Je komt te werken in het IT-team bestaande uit de Lead developer en 4 (medior/senior) developers. Gezamenlijk werken jullie aan de verbetering en uitbreiding van de software. Binnen het development team is er veel vrijheid en zelfstandigheid, zonder dat ze hiermee afdoen aan de kwaliteit. Zo hebben ze elke ochtend een korte stand-up (10:00 uur) en werken ze met pair-programming sessies. Ook is er een hele professionele ontwikkelcyclus waarbij code altijd eerst door een collega wordt getest voordat het naar deployement gaat. Er is een kwaliteitsfocus en dan biedt ruimte om verbeteringen echt door te voeren binnen de gehele

Bekijk vacature »

.NET developer

Functie Als .NET developer wordt jij onderdeel van ons ICT team. In dit multidisciplinaire team ben jij samen met onze senior .NET ontwikkelaar en medior .NET ontwikkelaar verantwoordelijk voor ons ERP systeem. In dit systeem (Navision) ga jij leren ontwikkelen. Wij bieden jou dan ook een gedegen opleiding aan, samen met de ondersteuning van onze Senior .NET developer. Daarnaast ga jij aan de slag met ons portaal geschreven in Sharepoint. Verder ben jij verantwoordelijk voor EDI verkeer en het ontwikkelen binnen het ERP systeem en andere toepassingen en rapportages. Van jou wordt verwacht dat jij het proces goed leert kennen

Bekijk vacature »

Junior Software Developer (HBO / WO)

Functie omschrijving Wij zijn op zoek naar een Junior Software Developer! Sta jij aan het begin van je carrière en heb je net je HBO of WO-diploma in de richting van ICT of Techniek mogen ontvangen? En heb jij grote affiniteit met software development? Dan hebben wij bij Jelling IT Professionals de perfecte opdrachtgever in de omgeving van Utrecht, die jou tot een volwaardig Fullstack Software Developer gaat opleiden. Binnen deze grote organisatie krijg je ruime en professionele trainingen die jouw in korte tijd vakbekwaam maken. Niet alleen het aan technisch aspect, maar ook zeker jouw persoonlijke ontwikkeling wordt veel

Bekijk vacature »

C# Developer Research and Development - Delft

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Delft Vacature ID: 6307 Introductie C# Developer Research and Development - Delft - Onze klant is één van de meest innovatieve bedrijven in de region van Delft. Op dit moment zijn ze voor het innovatie centrum. In het innovatie centrum wordt gewerkt aan de nieuwste technieken voor navigatie software. R&D / C# / Pattern Recognition / Algorithms / 3d Data / DotNET Functieomschrijving Als C# Developer kom je te werken in een innovatief scrumteam. We ontwikkelen en door ontwikkelen de nieuwste technieken op het gebied van navigatie software. Deze software wordt onder andere

Bekijk vacature »

Back-end .NET Developer

Functie omschrijving C# / .NET Developer gezocht voor een dynamische organisatie in de regio Houten! Voor een leuke organisatie in de regio Houten zijn wij op zoek naar een Back-end developer die klaar is voor een nieuwe uitdaging. In deze functie werk jij aan verschillende projecten en ga je vaak bij klanten op bezoek. Binnen deze functie kun je een grote mate van uitdaging, diversiteit en verantwoordelijkheid treffen. Bedrijfsprofiel Waar ga je werken? Het bedrijf waar je gaat werken is gespecialiseerd in het ontwerpen en implementeren van procesautomatisering en procesinformatisering. Zij doen dit onder andere voor de (petro)chemie, pharma, infra,

Bekijk vacature »

Als Front-end developer bijdragen aan het onderwij

Functie Als front-end developer om je terecht in een team van goede en ervaren developers, en ga je werken aan de software die door miljoenen mensen gebruikt wordt. Je bent in staat om designs effectief te vertalen naar werkende feautures en hebt oog voor een goede UX van het product. Je staat voor clean code en goede documentatie. Je ziet toegevoegde waarde in het beoordelen van het werk van collega’s om zo samen te streven naar hoge kwaliteit software en code. Je dagelijkse werk bestaat uit het werken aan componenten in de Storybook. Het verbeteren en refactoren van de huidige

Bekijk vacature »

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

PHP ontwikkelaar

Functie Jij komt te werken in een development team van 9 man. Het grootste deel doet back end development en daarnaast is er 1 teamlead en 1 tester in het team. Dit Agile team is van groots belang voor de organisatie omdat zij voornamelijk alle eigen systemen in-house ontwikkelen. Naast het door ontwikkelen van het bestaande platform en de software die daarbij komt kijken, zul jij je ook bezighouden met het realiseren en opzetten van nieuwe projecten binnen het bedrijf. Je staat nauw met de klant in contact om zo hun wensen zo goed mogelijk te kunnen realiseren. Daarnaast ontwikkel

Bekijk vacature »

Team Lead/ Lead developer gezocht (Hands-on, PHP,

Functie Als Team Lead ben je de leider van één van de ontwikkelteams binnen de organisatie. Je leidt als lead developer een goed draaiend team dat werkt aan complexe en duurzame applicaties en API’s. Vanuit je kennis en ervaring ben je in staat het grote plaatje te blijven overzien, en kritisch mee te denken over bijvoorbeeld de architectuur, maar ook de algehele aanpak binnen het project. Je laat je team niet alleen technisch goed functioneren maar ben ook betrokken bij het menselijke aspect. Zo weet jij je collega’s te motiveren en begeleiden in hun dagelijkse werk. Buiten het team ben

Bekijk vacature »

Fullstack developer

Functie omschrijving Ben jij toe aan een nieuwe uitdaging en zou jij graag bij een platte maar informele organisatie werken? Voor een mooi softwarebedrijf in omgeving Alblasserdam zijn wij op zoek naar versterking op de afdeling Software Development! Als Fullstack react.js developer wordt je bij dit bedrijf onderdeel van de volledige ontwikkeling van requirement tot oplevering! Jouw focus ligt op de front end en alles wat daarbij komt kijken. Je gaat ontwerpen, ontwikkelen, testen en valideren. Je zult voornamelijk werken met React.js en Typescript. Maar ook Javascript, HTML en CSS komen aanbod. Daarnaast zal je ook regelmatig met de back

Bekijk vacature »

Belastingdienst - Freelance Senior Applicatie ontw

Startdatum: 01.06.2023 Richttarief: €65,00 - €75,00 Duur van de opdracht: 6 maanden Uren per week: 36 Taal: Nederlands vereist! Gelieve in het Nederlands te solliciteren. Functieomschrijving: We verwachten van je, dat je: Brede ervaring hebt als JAVA-ontwikkelaar; Ervaring hebt met Agile/Scrum-werken en je thuis voelt in een Agile omgeving; Een aandeel levert aan het scrumproces en in de SAFe-releasetrain; Zelfstandig werkt in een scrumteam en intensief de samenwerking op zoekt met je directe collega’s en je omgeving; Ervaring meebrengt met het schattten en inplannen van taken tot en met het testen en demonstreren van de opgeleverde functionaliteit; Collega’s in je

Bekijk vacature »

.NET Developer Medior Senior

Dit ga je doen Ontwikkelprocessen verder optimaliseren en verder ontwikkelen met C#; CI/CD-pipelines automatiseren; Herbruikbare componenten maken; Testen; Front-end pagina's gebruiksvriendelijk maken. Hier ga je werken Als .NET Developer kom jij terecht binnen een grote en internationale organisatie. Zij streven naar een positieve impact op de mens, milieu en maatschappij. Het bedrijf is oorspronkelijk een familiebedrijf en werkt aan de productie van hoogwaardige en technische systemen voor de gezondheidszorg. Momenteel willen zij betere ontwikkelprocessen creëren op internationaal gebied en staat kwaliteit en veiligheid voor hun op nummer 1! Als .NET Developer werk jij aan het ontwikkelen van verbeterde software voor

Bekijk vacature »

PHP Web Developer

Functie omschrijving Voor een klein softwarebedrijf in de omgeving Roosendaal, zijn wij op zoek naar een PHP web developer met een aantal jaar werkervaring. Wil jij graag werken aan in-house software projecten voor diverse klanten? Voel jij je prettige in een klein team developers, waar jouw inbreng enorm gewaardeerd wordt? Lees dan snel verder! Jouw werkzaamheden zien er als volgt uit: Je wordt verantwoordelijk voor de ontwikkeling van diverse applicaties. Dit kan de ene keer een online platform voor aanbiedingen zijn, en de andere keer een software pakket dat gebruikt wordt om interne processen te automatiseren. Het zijn stuk voor

Bekijk vacature »

Senior Cobol Applicatieontwikkelaar

Bedrijfsomschrijving De IV- organisatie van de Belastingdienst is verantwoordelijk voor en verzorgt de ICT- voorzieningen. Het merendeel van de applicaties wordt op dit moment door de IV- organisatie zelf ontwikkeld, onderhouden en beheerd in het eigen data center. Naast de zorg voor continuïteit op de massale heffing- en inningsprocessen die plaatsvinden binnen een degelijke, stabiele omgeving, wordt er tevens volop gewerkt aan modernisering van het IV- landschap. Dit gebeurt deels intern door gebruik te maken van de expertise die intern aanwezig is, maar ook door het aantrekken van (kant-en-klaar) oplossingen en expertise uit de markt. Functieomschrijving In de applicatie ETM

Bekijk vacature »

Laravel Developer

Functie omschrijving Voor een gave organisatie in de buurt van Den Bosch zoek ik een PHP developer. Het is van belang dat je kennis/ervaring hebt met het framework Laravel. Jij gaat in deze functie software applicaties ontwikkelen. Deze software projecten zijn heel divers, en deze organisatie maakt software, van A tot Z. Klanten kunnen in elke sector werkzaam zijn, van profit tot non-profit. Andere taken zijn onder andere: documentatie schrijven over applicaties/uitleg geven over software en applicaties/ klantcontact over bestaande applicaties/applicaties optimaliseren. Bedrijfsprofiel Deze organisatie zit in de regio van Den Bosch en is een klein bedrijf. Er werken circa

Bekijk vacature »

Pagina: « vorige 1 2 3 volgende »

Wouter J

Wouter J

17/11/2013 15:46:37
Quote Anchor link
>> Dus mijn opzet zoals ik die nu heb die klopt dan gewoon?

jupperdejuppie
 
PHP hulp

PHP hulp

04/01/2025 03:47:37
 
Ozzie PHP

Ozzie PHP

17/11/2013 15:47:34
Quote Anchor link
>> 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.

Oké... dan klopt het dus hoe ik het nu doe :)

Toevoeging op 17/11/2013 15:47:56:

>> jupperdejuppie

Jeee!! :-)))

Toevoeging op 17/11/2013 17:05:30:

Wouter, nog even een vraagje over wat jij eerder zei. Jij zei dat het nuttig is om een exception hiërarchie op te bouwen.

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

Kun je een praktijk-voorbeeld geven wanneer zo'n hiërarchie een meerwaarde kan zijn?

Wat ik namelijk niet helemaal begrijp... stel we hebben een FooException, en we hebben 5 andere Exceptions die de FooException extenden. Wat is dan precies daar de meerwaarde van? Blijkbaar kunnen we dit doen om in 1x alle FooExceptions te catchen? Oké, prima... maar als dat de reden is, en we blijkbaar alle FooExceptions op dezelfde manier willen behandelen, waarom gebruiken we dan niet slechts 1 FooException?

In de praktijk... waarom zouden we bijv. een DirectoryException maken en een FileException, die beiden de FileSystemException extenden? Ik kan toch gewoon 1 FileSystemException gebruiken en via $message aangeven wat er fout gaat ("Er kan geen directory worden aangemaakt" of "De file kan niet worden opgeslagen".) Waarom zou je hier meerdere Exceptions voor willen gebruiken?
Gewijzigd op 17/11/2013 17:06:33 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

17/11/2013 18:26:34
Quote Anchor link
Ozzie PHP op 17/11/2013 15:47:34:
In de praktijk... waarom zouden we bijv. een DirectoryException maken en een FileException, die beiden de FileSystemException extenden? Ik kan toch gewoon 1 FileSystemException gebruiken en via $message aangeven wat er fout gaat ("Er kan geen directory worden aangemaakt" of "De file kan niet worden opgeslagen".) Waarom zou je hier meerdere Exceptions voor willen gebruiken?

Zou je daarvoor dan niet op zijn minst $code gebruiken met een unieke integer/constante? Als het toch één exception is, kan je daarmee in elk geval nog varianten van dezelfde exception onderscheiden.

Een file system is sowieso een klasse apart (hint-hint) omdat een directory technisch weinig meer is dan een bestand dat andere bestanden bevat. Hetzelfde geldt voor een zip-bestand of ander type archive. En hetzelfde geldt voor constructies zoals een station en een partitie. Je hebt hier een iterator nodig en daarmee een speciale exception.
 
Ozzie PHP

Ozzie PHP

17/11/2013 20:31:27
Quote Anchor link
>> Zou je daarvoor dan niet op zijn minst $code gebruiken met een unieke integer/constante? Als het toch één exception is, kan je daarmee in elk geval nog varianten van dezelfde exception onderscheiden.

Waarvoor zou je dan precies een code gebruiken? Ik kan toch ook een message gebruiken om te zeggen wat er mis is? Als ik bijv. zou zeggen, foutcode is 20, dan weet ik niet wat er wordt bedoeld. Als ik echter een message hebt die zegt "Ik kan geen directory aanmaken" dan snap ik wel wat er wordt bedoeld. Wat is de meerwaarde van een code?

Kan iemand dan een praktijk-voorbeeld geven wanneer het extenden van Exceptions nuttig is, want dat begrijp ik nog steeds niet.
 
Dos Moonen

Dos Moonen

17/11/2013 20:59:39
Quote Anchor link
http://www.php.net/manual/en/spl.exceptions.php

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
24
25
26
27
<?php

try
{
    ...
}

catch (InvalidArgumentException $e) {}
catch (BadMethodCallException $e) {}
catch (OutOfRangeException $e) {}

if (isset($e))
{

    // doe iets (DRY, maar hacky)
}

// Versus

try
{
    ...
}

catch (LogicException $e)
{

    // doe iets
}

?>
 
Ozzie PHP

Ozzie PHP

17/11/2013 21:01:33
Quote Anchor link
Dos, thanks... maar wat heeft dit precies met mijn vraag te maken?? :)
 
Dos Moonen

Dos Moonen

17/11/2013 21:15:12
Quote Anchor link
Het eerste kun je zonder hiërarchie ook.
Het tweede niet. (Ik reken \Exception even niet als hiërarchie.)
Een hele groep van exceptions af kunnen vangen is als programmeur fijner dan elke exception individueel afvangen.
 
Ozzie PHP

Ozzie PHP

17/11/2013 21:23:54
Quote Anchor link
Dos, dat kan ik in zeker zin wel volgen... maar ik snap niet wanneer je het in de praktijk zou moeten gebruiken. Wat jij nu laat zien is (als ik je goed begrijp) dat je een heleboel Exception classes de LogicException class laat extenden, en uiteindelijk vang je dan de LogicException op. Maar dan weet je aan het eind van de rit toch helemaal niet welke Exception je opvangt, en hoe je die moet afvangen?

Ik snap technisch gezien wel wat je doen, maar ik zie het nut tot op heden nog niet. Jouw voorbeeld zou je ook iedere exception de standaard exception kunnen laten extenden en dan in het catch-blok kunnen controleren op Exception.

Ik vind het nog een beetje vaag, en ik zie tot nu toe eerlijk gezegd ook nog geen enkel praktijk-voorbeeld.
 
Wouter J

Wouter J

17/11/2013 21:30:04
Quote Anchor link
Oké, we blijven bij onze DatabaseExceptions. Stel we hebben een database cacher. Het zal die cacher een worst wezen of het een CouldNotConnectException is of een InvalidQueryException. Het gaat die cacher erom dat de database niet werkt.

Daarom zal die cacher gaan catchen op de algemene DatabaseException. Dat terwijl de database klasse alleen maar CouldNotConnectException of InvalidQueryException gooit.

Dan hebben we nu een UserMapper. Zodra we daar een user by id opvragen zal hij ook die database klasse willen gebruiken. Voor hem is het echter wel belangrijk wat het type exception is. De CouldNotConnectException zal hij namelijk lekker moeten laten opborrelen, maar een InvalidQueryException is een exception die aangeeft dat hij iets fout doet. Dat moet hij dus zelf zien op te lossen.

Daarom is het gebruik van hierarchy belangrijk.

En een code is inderdaad onduidelijk, behalve als je er een constante aan hangt. Bijv. CouldNotConnectException::ERR_INVALID_CREDENTIALS. Je gebruikt codes omdat je weet dat je deze verschillende typen exceptions niet apart wilt catchen, maar je wilt toch onderscheid ertussen maken.
 
Ozzie PHP

Ozzie PHP

17/11/2013 21:38:50
Quote Anchor link
Dankjewel Wouter, nu wordt het al wat duidelijker.

Dat van die codes snap ik nog niet helemaal. Ten eerste, gebruik jij echt een code (een nummertje)? En ten tweede, wat is het verschil of ik dan die code meegeef, of in mijn $message "Invalid credentials" zet. Dat komt toch op hetzelfde neer?
 
Wouter J

Wouter J

17/11/2013 21:40:36
Quote Anchor link
Ja, message en code komt op het zelfde neer. De code is echter voor de computer goed begrijpbaar en de message voor de mens.
 
Dos Moonen

Dos Moonen

17/11/2013 21:41:10
Quote Anchor link
Kijk maar eens naar http://kohanaframework.org/3.3/guide-api/HTTP_Exception dan.

In Request_Client_Internal::execute_request() staat het volgende:
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
<?php

    try
    {
        ...
    }

    catch (HTTP_Exception $e)
    {

        // Get the response via the Exception
        $response = $e->get_response();
    }

    catch (Exception $e)
    {

        // Generate an appropriate Response object
        $response = Kohana_Exception::_handler($e);
    }


?>


Op die manier kun je de get_response() van HTTP_401_Exception en HTTP_404_Exception overschrijven en de rest (op HTTP_Expected en subclasses na) houd het standaard gedrag.

Zonder een hiërarchie zou je heel veel code herhalen. Wat niet bepaald DRY is.
 
Ozzie PHP

Ozzie PHP

17/11/2013 21:48:26
Quote Anchor link
>> Ja, message en code komt op het zelfde neer. De code is echter voor de computer goed begrijpbaar en de message voor de mens.

Oke, duidelijk. Maar wat doe je dan met die code? Waarvoor gebruik je die?
 
Ozzie PHP

Ozzie PHP

01/12/2013 03:29:42
Quote Anchor link
Ik ben even de weg kwijt.

Als je bijv. een filesystem class hebt, wat voor soorten exceptions moet die dan kunnen gooien? Ik dacht in 1e instantie dat deze class gewoon telkens als er iets fout gaat een FilesystemException zou moeten gooien. Eerder werd ergens gesteld dat iedere class z'n eigen exception moet hebben, dus dit leek me de juiste oplossing. Nu loop ik tegen het probleem aan dat ik in de problemen kom.

Stel ik doe in class Foo dit:

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

try {
  $this->filesystem->deleteDirectory($dir);
}
catch (FilesystemException $e) {
  // directory kan niet worden verwijderd
}

?>

En in de Filesystem class staat 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

public function deleteDirectory($dir) {
  if (is_dir($dir)) {
    throw new FilesystemException('dir already exists');
  }
else {
    if (!rmdir($dir)) {
      throw new FilesystemException('could not remove dir');
    }
  }
}


?>

Zoals je ziet kunnen er in deze method 2 exceptions optreden. Op het moment dat de directory al bestaat, en op het moment dat de directory niet kan worden verwijderd.

We kunnen nu geen onderscheid maken tussen de beide exceptions. Oplossing: we gaan 2 verschillende exceptions gooien en vangen:

Class Foo:

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

try {
  $this->filesystem->deleteDirectory($dir);
}
catch (RunTimeException $e) {
  // directory kan niet worden verwijderd
}

?>

En de Filesystem 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
<?php

public function deleteDirectory($dir) {
  if (is_dir($dir)) {
    throw new UnexpectedValueException('dir already exists');
  }
else {
    if (!rmdir($dir)) {
      throw new RunTimeException('could not remove dir');
    }
  }
}


?>

Nu gaat het wel goed, maar gebruik ik ineens dus helemaal geen FilesystemException meer. Dat lijkt me ook niet kloppen toch? Ik begreep eerder dat het goed is dat een class zijn eigen exception heeft, maar als ik in dit voorbeeld een FilesystemException zou gebruiken, dan werkt het niet. Dus ik snap nu even niet A) of je wel of niet eigen exceptions moet gebruiken en B) zo ja, wanneer en op welke manier. Ik zit aardig op het goede spoor, maar iets klopt er nog niet helemaal in mijn gedachten. Kan iemand me weer wat wijzer maken?
Gewijzigd op 01/12/2013 03:33:38 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

01/12/2013 09:22:44
Quote Anchor link
Ozzie PHP op 01/12/2013 03:29:42:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
public function deleteDirectory($dir) {
  if (is_dir($dir)) {
    throw new UnexpectedValueException('dir already exists');
  }
else {
    if (!rmdir($dir)) {
      throw new RunTimeException('could not remove dir');
    }
  }
}

?>


Je maakt een logicafout. Je kunt alleen een directory verwijderen die bestaat. Je zou hier dus !is_dir($dir) voor "is geen directory" verwachten. Daarmee krijg je één FilesystemException voor twee samenhangende fouten:
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
/**
 * @param string $dir Path to the directory to delete.
 * @return bool
 * @throws FilesystemException
 */

public function deleteDirectory($dir)
{

    if (!is_dir($dir) || !rmdir($dir)) {
        throw new FilesystemException('Could not delete directory.');
    }

    return true;
}

?>

Als je het even test, blijkt rmdir() zelf al te controleren of de directory bestaat. Bestaat de directory namelijk niet, dan krijg je een warning: "No such file or directory." Aangezien een is_dir() al is geïmplementeerd in rmdir(), kun je het vereenvoudigen tot:
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
/**
 * @param string $dir Path to the directory to delete.
 * @return bool
 * @throws FilesystemException
 */

public function deleteDirectory($dir)
{

    if (!rmdir($dir)) {
        throw new FilesystemException('Could not delete directory.');
    }

    return true;
}

?>
Gewijzigd op 01/12/2013 09:31:32 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

01/12/2013 10:52:19
Quote Anchor link
Jij zit goed op te letten Ward. Dat krijg je dus als je veel te laat een bericht post. Wat jij zegt klopt, maar er zit een kleine kanttekening aan.

Als je een directory verwijdert die niet bestaat en je gooit vervolgens een FilesystemException, dan zal class Foo dus denken dat het verwijderen is mislukt, en dat de directory nog steeds bestaat. Class Foo zal dus denken dat het fout gaat.

Een beter en duidelijker voorbeeld is het aanmaken van een directory. Zelfde principe... Class Foo maakt een directory aan en wil daarna een aantal bestanden in die directory plaatsen. Jouw code (aangepast):

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
/**
 * @param string $dir Path to the directory to create.
 * @return bool
 * @throws FilesystemException
 */

public function createDirectory($dir)
{

    if (!mkdir($dir)) {
        throw new FilesystemException('Could not delete directory.');
    }

    return true;
}

?>

En in class Foo:

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

try {
  $this->filesystem->createDirectory($dir);
}
catch (FilesystemException $e) {
  // directory kan niet worden aangemaakt
}

?>

Stel nu dat de directory al bestaat, dan geeft jouw code een FilesystemException, waardoor class Foo zal denken dat de directory niet kon worden aangemaakt. Class Foo gaat er dus vanuit dat de directory niet bestaat en zal er dus ook geen bestanden in gaan plaatsen. Het gaat dan dus mis, terwijl de bestanden eigenlijk wel hadden kunnen worden geplaatst, omdat de directory al bestond.

Het gooien van slechts 1 type exception is dus volgens mij niet toereikend???
Gewijzigd op 01/12/2013 10:55:23 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

01/12/2013 11:13:46
Quote Anchor link
Ozzie PHP op 01/12/2013 10:52:19:
Stel nu dat de directory al bestaat, dan geeft jouw code een FilesystemException, waardoor class Foo zal denken dat de directory niet kon worden aangemaakt. Class Foo gaat er dus vanuit dat de directory niet bestaat en zal er dus ook geen bestanden in gaan plaatsen. Het gaat dan dus mis, terwijl de bestanden eigenlijk wel hadden kunnen worden geplaatst, omdat de directory al bestond.

De klasse Foo denkt zelf niets, maar belandt in de catch. Daarin plaats je vervolgens een oplossing.

Je voorbeeld bevat al een duidelijke ontwerpbeslissing: het maken van een directory mag mislukken als de directory al bestaat, want dan kunnen we daarin bestanden opslaan. Dan kun je dat formaliseren in de naam en code van de methode. Even in een complete if-elseif-else om alle cases af te dekken:
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
<?php
/**
 * @param string $dir Path to the directory to check for and create.
 * @return bool
 * @throws FilesystemException
 */

public function createDirectoryIfNotExists($dir)
{

    if (is_dir($dir)) {
        return true;
    }
elseif (!mkdir($dir)) {
        throw new FilesystemException('Could not create directory.');
    }
else {
        return true;
    }
}

?>

Gaat dat je te ver, dan moet je de try of de catch van Foo uitbreiden. En dat moet eigenlijk ook als je ontwerpbeslissing vooral voor Foo geldt.
 
Ozzie PHP

Ozzie PHP

01/12/2013 11:18:06
Quote Anchor link
Thanks Ward. Dat vind ik dus het lastige... want als de directory inderdaad al bestaat, zoals jij zegt, is er dan wel of niet sprake van een exception? Is het aanmaken van een directory die al blijkt te bestaan wel of niet een exception?

Het valt me trouwens op dat je true returnt. Is dat iets wat je altijd doet? Ik bedoel, waarom return je een boolean als je toch al een exception gooit? Dat lijkt me dubbelop?
 
Ward van der Put
Moderator

Ward van der Put

01/12/2013 11:23:37
Quote Anchor link
Je kunt inderdaad ook null retourneren: dan heb je null voor "nothing to do" en true voor "directory created". En eigenlijk hadden we hier binnen class Filesystem een uitstapje moeten maken naar Filesystem::directoryExists(). Maar het gaat even om de gedachte.

Als jij het okay vindt dat een directory niet wordt gemaakt als die al bestaat, dan is dat geen exception waard. Het systeem gedraagt zich dan namelijk zoals jij het ontworpen hebt.
 
Ozzie PHP

Ozzie PHP

01/12/2013 11:40:31
Quote Anchor link
>> Je kunt inderdaad ook null retourneren: dan heb je null voor "nothing to do" en true voor "directory created".

Waarom return je per se iets? Je kunt toch ook helemaal niks returnen, maar alleen een exception gooien? Als er dan geen exception wordt opgevangen weet je dat het goed is gegaan :) Het heeft (wat mij betreft) alleen zin om iets te returnen als je ook iets met die waarde gaat doen, maar dat is nu niet het geval.

Filesystem::directoryExists() ... haha, ja daar heb je dus een punt waar ik lang over heb moeten denken. Maar dan zou ik dus altijd voordat ik een directory aanmaak, moeten controleren of die wel of niet bestaat. Ik weet niet of dat handig is? Doe jij dat ook op die manier?
 

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.