abstract private method?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Junior .NET developer

Functie Als junior .NET Developer start jij in een team met 15 developers. In het team is er genoeg senioriteit om ervoor te zorgen dat jij de juiste begeleiding krijgt. Jij begint als eerst alle software pakketten en processen eigen te maken. Vervolgens ga jij deze software programmeren, onderhouden en testen. Ook ga jij research doen naar nieuwe mogelijkheden en zoek jij uit hoe je dit kan implementeren. Jullie werken intern op project basis en afhankelijk van het project werken jullie wel of niet iedere ochtend met een standup. Je gaat als Full stack developer aan de slag en gaat

Bekijk vacature »

C#.NET Developer

Functieomschrijving Voor een software ontwikkelaar in de omgeving van Vught zijn we op zoek naar een gemotiveerde C# ontwikkelaar. Deel jij hun passie voor development en dan vooral in C#.NET? Dan kan dit wel eens jouw droombaan zijn! Jouw werkzaamheden zullen er ongeveer als volgt uit gaan zien Door de wensen van de klant goed te begrijpen ga jij aan de slag dit om te zetten naar passende oplossingen en werk je deze uit tot een sterk eindproduct. Je gaat je bezighouden met de ontwikkeling van webapplicaties en websites, dit doe je door middel van ASP.NET, MVC Frameworks en C#.

Bekijk vacature »

Ontwikkelaar MS Dynamics 365 Projecten

Samengevat: Deze werkgever is de kwaliteitsdienst in de tuinbouwsector. Ben jij een ervaren ontwikkelaar? Heb jij ervaring met Ms Dynamics 365 BC? Vaste baan: Ontwikkelaar Ms Dynamics 365 BC ICT MBO 3.500 - 5.000 Ontwikkelaar Ms Dynamics 365 BC Ons bedrijf bewaakt en bevordert de kwaliteit van producten, processen en ketens in de tuinbouw. Wij kenmerken zich door openheid, ruimte voor initiatief, collegialiteit en zelfontplooiing. Deze werkgever is een veelzijdige organisatie. Je werkt voor de eigen IT organisatie. Zij werken met moderne technologie en staan open voor innovatie. Functie: Voor de vacature als Ontwikkelaar Ms Dynamics 365 BC Roelofarendsveen MBO

Bekijk vacature »

C# .NET Developer

Functie omschrijving Wij zijn op zoek naar een C# .NET Developer voor een bedrijf in de omgeving van Utrecht! Wil jij werken voor een internationaal bedrijf waar je legio mogelijkheden krijgt als Software Ontwikkelaar? Grijp nu je kans! Je kunt een uitdagende rol gaan vervullen als C#.NET Developer binnen een internationaal bedrijf dat gevestigd is in omgeving van Utrecht. Je zult gaan samenwerken met collega's die over de hele wereld verspreid zitten. Dit bedrijf is zeer vooruitstrevend en werkt met de nieuwste technieken. Als C#.NET Developer ga jij je bezig houden met het volgende: Je blijft op de hoogte van

Bekijk vacature »

.Net developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als .Net Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Als developer bouw je in DevOps teams aan enterprise applicaties, nieuwe IOT, Chatbots of AI oplossingen. Deze snelgroeiende groep collega’s krijgt energie van hun vak en dat merk je op de werkvloer. Natuurlijk krijg jij de mogelijkheid je te certificeren in dit vakgebied. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling. Mede hierdoor zij wij vorig jaar Microsoft Partner of the year geworden.

Bekijk vacature »

Fullstack Developer

Functieomschrijving Voor een erkende werkgever in regio Etten-Leur zijn wij op zoek naar een Fullstack Developer met PHP/Laravel ervaring. Je gaat aan de slag met het bouwen van maatwerk software voor klanten die actief zijn in een specifieke markt. Als fullstack developer ben je samen met een enthousiast team van 7 collega’s verantwoordelijk voor de ontwikkeling, beheer en innovatie van informatiesystemen voor klanten in een specifieke branche. Verder ondersteun je complexe uitdagingen van klanten. Je brengt hun wensen in kaart en vertaalt deze door naar maatwerk software. Ervaring met Laravel is een must. Om de klant zo goed mogelijk te

Bekijk vacature »

Belastingdienst - Freelance Senior Cobol Applicati

Startdatum: 01.06.2023 Richttarief: €65,00 - €75,00 Duur van de opdracht: 7 maanden Uren per week: 36 Taal: Nederlands vereist! Gelieve in het Nederlands te solliciteren. Functieomschrijving: In de applicatie ETM zijn nu de inningsvoorzieningen voor ongeveer 25 aangifte- en aanslagmiddelen opgenomen. ETM is een extern aangeschafte service en het huidige contract met leverancier Oracle loopt af op 31-12-2022. Het programma uitfaseren ETM heeft als doel om vervanging te realiseren waarmee alle nu in gebruik zijnde ETM ondersteuning wordt overgenomen in nieuwe Inningsvoorzieningen om de continuïteit van de inningsprocessen te waarborgen. Eén van de inningsvoorzieningen die voor het einde van 31-12-2022

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Backend developer

Functie omschrijving Ben jij graag bezig met de back-end van applicaties? Zou je dit graag willen doen voor een kleine werkgever waar ook tijd is voor een drankje op zijn tijd? Je taken hierbij zullen bestaan uit: Gebruik maken van de volgende technieken: .NET (core), C#, SQL, XML, MVC, JSON, REST & SOAP API. Gebruik maken van de volgende tools: Visual Studio, GIT, Jira, Jenkins. Bovengenoemde technieken en tools ga je gebruiken om: Nieuwe functionaliteiten te ontwikkelen. Wijzigingsverzoeken van klanten uitvoeren. Verzorgen van koppelingen tussen data. Bedrijfsprofiel Jouw nieuwe werkgever bevindt zich in regio Raamdonksveer en bieden oplossingen op gebied

Bekijk vacature »

Back end developer Digital Agency

Functie Wij zijn van origine een wordpress bureau, maar sinds 2006 zijn wij dit wel redelijk ontgroeid. Naar mate de jaren verstreken zijn we gegroeid in omvang, maar ook in de complexiteit van opdrachten waarin wij onze klanten kunnen bedienen. Momenteel bestaat onze organisatie uit 4 front end developers, 12 back end developer 3 projectmanagers en een 2 koppig management. Wij zijn een hele informele, bijna familiaire organisatie. Geen strak pak of overhemd, nee gewoon dragen waar jij je prettig bij voelt. De gemiddelde leeftijd ligt tussen de 25 en 30 en wij doen er veel aan om onze hechte

Bekijk vacature »

Front end developer binnen de consultancy

Functie Je komt in een team met ambitieuze developers die de passie voor Front-End met jou delen. Samen ga je aan de slag met leuke en leerzame opdrachten. Het team heeft een eigen budget en financiën en zij bepalen zelf hoe dat besteed en investeert wordt. Je gebruikt tools als JavaScript, Node.js, React, Angular, Typescript en Vue.js wanneer je werkt aan de opdrachten. Daarnaast zul je veel leren van je collega’s en gezamenlijk een leuke tijd doorbrengen tijdens activiteiten zoals wintersport, hackatons en conferentiebezoeken. Je krijgt niet alleen de mogelijkheid Front-End te ontwikkelen, maar ook vooral jezelf. Dit kan behaald

Bekijk vacature »

Low Code Ontwikkelaar

In het kort Als Low Code Developer werk je aan projecten bij en voor onze klanten, waarbij je voor het ontwikkelen van de oplossingen een technisch low-code platform gebruikt. Samen met het team streef je naar de beste oplossing en bepalen jullie de juiste aanpak. Je rol is divers en je bent van begin tot eind betrokken bij de ontwikkeling zowel de back-end en de front-end van de applicatie. Naast de ontwikkeling en oplevering, breng je ook advies uit aan de klant waarom bepaalde keuzes worden gemaakt. Je bent dan ook communicatief sterk en kunt je keuzes goed (inhoudelijk) onderbouwen.

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 »

Softwareontwikkelaar Cleopatra

Functieomschrijving: De directie Verkeer en Openbare ruimte van de gemeente Amsterdam beschikt over een softwareapplicatie, "Cleopatra", waarmee geautomatiseerde handhaving plaatsvindt (op basis van kentekenherkenning) van bepaalde gebieden waarin toegangseisen worden gesteld aan het verkeer. Voorbeelden ervan zijn de milieuzones, de zone zwaar verkeer, handhaving van bromen snorfietser op het fietspad en autoluwe gebieden. Voor de doorontwikkeling en uitbreiding ervan zijn gespecialiseerde softwareontwikkelaars nodig die helpen bij het programmeren van de handhavingsmodules voor nieuwe gebieden en het verbeteren en bijwerken van de bestaande onderdelen van de softwareapplicatie.De opdracht bestaat uit: het programmeren van de diverse modules;het tijdens demo's tonen van de

Bekijk vacature »

OutSystems developer

Dit ga je doen Klanten adviseren over de mogelijkheden van OutSystems; OutSystems oplossingen ontwikkelen en implementeren; Stakeholdermanagement; Kennis en expertise up to date houden en delen met het team. Hier ga je werken Onze opdrachtgever, gevestigd in regio Amsterdam, is een innovatieve dienstverlener die zich richt op grote corporates in verschillende sectoren. Doordat je bij veel verschillende klanten aan de slag zal gaan is geen enkel project hetzelfde. De organisatie kenmerkt zich door hoge mate van professionaliteit en innovatieve oplossingen. In de rol van OutSystems developer zal jij verschillende grote klanten helpen om efficiënte OutSystems oplossingen te ontwikkelen en implementeren.

Bekijk vacature »

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

01/11/2013 20:25:27
Quote Anchor link
Ola,

Ik heb een basis-class Foo. Ik wil dat iedere class die class Foo extend de private method foobar() heeft.

Nu heb ik van de class Foo een abstract class gemaakt, waarin staat:

abstract private function foobar();

Nu krijg ik een foutmelding:

abstract function foobar() cannot be declared private in...

Waarom kan ik geen private abstracte methods maken? Of doe ik iets verkeerd?
 
PHP hulp

PHP hulp

27/05/2026 08:36:18
 
Frank Nietbelangrijk

Frank Nietbelangrijk

01/11/2013 21:14:43
Quote Anchor link
Hum het zou toch ook geen zin hebben? Je kunt immers geen private functie overschrijven. Privé is privé en daar blijft de rest van de wereld af.

Waarom gebruik je geen interface?
 
Ozzie PHP

Ozzie PHP

01/11/2013 21:39:21
Quote Anchor link
Dat was mijn eerste idee ook Frank, maar ook hier kan ik geen private methods declareren (ook wel logisch eigenlijk). Dus daarom dacht ik een abstract class te gaan gebruiken.

Maar als ik het dus goed begrijp kan ik nooit een private method forceren?
 
Wouter J

Wouter J

01/11/2013 21:42:35
Quote Anchor link
Interfaces en abstracte methods moeten worden gezien als een contract. Een klaase houdt zich aan het contract door ten minste de benodigde methods te hebben.

Nu wil jij een contract maken voor een private method. Een private method, wweet je nog? Die kun je alleen via de klasse zelf aanroepen. Je gaat dus een contract met jezelf maken. Alsof je een contract zou maken voor het werk dat jij nu doet voor je framework. Dat doe je niet, want dat is pure onzin. Zo is het in PHP ook.

En PHP helpt je gelukkig om onzin code te voorkomen door een error te gooien.
 
Ozzie PHP

Ozzie PHP

01/11/2013 21:50:46
Quote Anchor link
>> Een private method, wweet je nog? Die kun je alleen via de klasse zelf aanroepen

Oke, dat was ook exact mijn bedoeling :) Ik wil dus forceren dat ik in iedere class die specifieke method moet hebben staan, zodat ik die niet vergeet. Ik zie dat het wel werkt als ik de method protected maak.

Om nog even terug te komen op wat jij zegt... waarom is het zo raar eigenlijk om een private method te forceren? Ik wil die method vanuit de constructor triggeren... ja natuurlijk, ik kan de code ook meteen in de constructor zetten, maar ik vind het duidelijker als ik het in een aparte method zet. Dat PHP dat niet toestaat... vooruit, maar dat jij het bestempelt als pure onzin.. mwa.. vind ik een beetje overdreven.

Stel dat ik een autobouwer ben van het merk BMW, en we beschouwen de auto als een class. Dan zou ik willen forceren dat iedere auto van het merk BMW een startonderbreker heeft. Dit apparaat is uitsluitend vanuit de auto (class) zelf bereikbaar. Het is dan heel prettig als er een blauwdruk ligt waarin staat dat iedere auto een startonderbreker heeft, zodat die nooit kan worden vergeten.

Anyhow... wat ik wil gaat dus niet. En dat was eigenlijk mijn vraag.
Gewijzigd op 01/11/2013 21:52:29 door Ozzie PHP
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

01/11/2013 22:27:16
Quote Anchor link
Weet je wel wat je nu zegt?
Stel BMW heeft ook fietsen, maar een fiets heeft een protected class fietsbel. Vul het zelf maar in....
 
Ozzie PHP

Ozzie PHP

01/11/2013 22:39:07
Quote Anchor link
Hehehe, Ger... ik denk dat je een punt probeert te maken, alleen ik volg ff niet welk punt :)

>> Stel BMW heeft ook fietsen

Euhhh... oke... :P

>> maar een fiets heeft een protected class fietsbel

Een protected class??? Tja, ehh...
(Er van uitgaande dat je een method bedoelt... een fietsbel moet je van buitenaf bij kunnen, dus die maak je uiteraard public.)

>> Vul het zelf maar in....

Misschien kun jij dat beter even doen :) Jouw kennende zul je zeker een goed punt hebben, alleen ik zie het niet... dus vertel, wat bedoel je te zeggen?
Gewijzigd op 01/11/2013 22:57:10 door Ozzie PHP
 
Reshad F

Reshad F

01/11/2013 23:07:26
Quote Anchor link
Als je het vanuit de constructor aanroept waarom dan niet

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

public abstract class foo {

public function construct() {
 bar();
}


private function bar() {
 //
}

}

?>


en dan vanuit je child klasses je parent construct aanroepen?
 
Wouter J

Wouter J

01/11/2013 23:19:21
Quote Anchor link
Ozzie, vanuit de abstracte class kun je geen private method aanroepen. Dus "ik roep hem aan in de constructor" betekend dat je die method in de constructor van de child class aanroept. Dan is het volledig zijn zorgen. De contracten in OO zijn bedoeld voor de buitenwereld. Stel je voor een abstracte class gebruikt ergens de getRegex method, deze zal moeten worden geïmplementeerd door de child class. Dan maak je deze method abstract, zodat je zeker weet dat je geen 'undefined method getRegex' error krijgt.
Hetzelfde werkt met interfaces, zodra ik weet dat een object een bepaalt interface heeft kan ik er altijd van uitgaan dat die methods bestaan en ik die methods kan gebruiken zonder dat ik 'undefined method' errors krijg.

Hoe die methods er uitzien en wat die klasse vanbinnen doet maakt het andere object niks uit, daar mag hij zelfs helemaal niks over weten. Hij mag alleen weten dat die methods die in het contract staan aanwezig zijn.

Geef eens een echt voorbeeld waarin je dit wilt toepassen. Want ik ben bang dat je of het woord abstract of het woord private niet begrijpt...
 
Ozzie PHP

Ozzie PHP

02/11/2013 00:05:50
Quote Anchor link
Ik zal het voorbeeld geven. Ik heb dus een eigen "default" exception class, voor het gemak noem ik die nu even MyDefaultException. Deze extend de PPH Exception class.

Nu was mijn bedoeling om met custom Exception classes te gaan werken, bijv. een FileSystemException. Deze extend dan de MyDefaultException class.

Wat ik wilde doen is mezelf verplichten om voor iedere custom Exception class een "mooi" bericht te maken, op basis van de message die wordt meegegeven aan de constructor. Eigenlijk hetzelfde wat jij ook doet, alleen jij doet dit in de constructor:

Even jou gequote uit een ander topic:

Wouter J op 01/11/2013 14:58:29:
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
class FileNotFoundException extends FileException
{
    public function __construct($filename, $message = '', $code = 0, \Exception $previous = null)
    {

        parent::__construct(
            sprintf('Cannot find file "%s"%s', $filename, ';'.$message ?: ''),
            $code,
            $previous,
        );
    }
}

?>

Wat jij hier doet in de constructor... sprintf('Cannot find file "%s"%s', $filename, ';'.$message ?: '') ... dat wil ik in een method stoppen die door de constructor wordt aangeroepen. Waarom? Om het voor mezelf wat overzichtelijker te houden wat er in de code gebeurt. Mijn idee was dus (grofweg) zeg maar dit:

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
<?php
class FileSystemException extends MyDefaultException {

  public function __construct($message, $code = 0, Exception $previous = null)
    parent::construct($this->setMessage($message), $code, $previous);
  }


  // Set the message.
  private function setMessage($message) {
    $message = 'The FileSystem experienced an exception:<br>' . $message;
    return $message;
  }

}


// en dan ergens in de filesystem class...
if ('bestand kan niet worden geschreven') {
  throw FileSystemException('The file ' . $file . ' could not be written.');
}


?>

Ik wil dus een setMessage() method forceren zodat ik altijd verplicht ben om een mooie/nette "message" op te stellen. Door deze method te verplichten, kan ik het ook nooit vergeten. En waarom deze method private is... omdat ik die niet van buitenaf wil kunnen aanroepen.

Ik hoop dat je het nu beter begrijpt.
 
Ward van der Put
Moderator

Ward van der Put

02/11/2013 10:58:22
Quote Anchor link
Ozzie PHP op 02/11/2013 00:05:50:
Ik wil dus een setMessage() method forceren zodat ik altijd verplicht ben om een mooie/nette "message" op te stellen. Door deze method te verplichten, kan ik het ook nooit vergeten. En waarom deze method private is... omdat ik die niet van buitenaf wil kunnen aanroepen.

Maak dan $message in de constructor een vereist argument. Zoals in example #2 in de PHP Manual.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
throw new FileSystemException('File not found.', 404);

class FileSystemException extends Exception
{
    public function __construct($message, $code = 0, \Exception $previous = null)
    {

        parent::__construct($message, $code, $previous);
    }
}

?>

Hoewel $message slechts de string 'File not found.' bevat, krijg je een gedetailleerde melding inclusief stack trace. Heb je hier echt niet genoeg aan?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<br />
<b>Fatal error</b>:  Uncaught exception 'FileSystemException' with message 'File not found.' in C:\pad\naar\index.php:2
Stack trace:
#0 {main}
  thrown in <b>C:\pad\naar\index.php</b> on line <b>2</b><br />
Gewijzigd op 02/11/2013 11:01:45 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

02/11/2013 14:37:01
Quote Anchor link
Ward, dankjewel, maar die stack trace die krijg jij toch alleen maar te zien omdat jij de Exception niet hebt opgevangen? Als je de Exception correct opvangt krijg je die stack trace niet te zie.

Maar je moet het meer zien in de lijn met het voorbeeld van Wouter. Bijv. een InvalidInputException. Als je die Exception gooit, wil je eigenlijk maar 2 parameters doorgeven: throw new InvalidInputException('foo', 'integer');

De message moet dan uiteindelijk zoets worden:

Invalid input was given: 'foo' is not an integer.
Exception occured in file ... on line ...

En het opstellen van die message, daar wil ik dus een setMessage method voor gebruiken. Om af te dwingen dat ik die method niet vergeet, wilde ik 'm dus opnemen als abstract private method.

Snappen jullie wat ik bedoel?
 
Wouter J

Wouter J

02/11/2013 14:50:35
Quote Anchor link
Ja, maar dan is het heeeeeel erg fout om dat met interfaces of abstracte methods te doen. Die zijn voor OO contracten, dingen die niet met programmeren te maken hebben. Dat jij je zelf wilt afdwingen iets in een method te doen, wat trouwens volkomen zinloos is, moet je jezelf gewoon net zo hard afdwingen als dat je classnamen met een hoofdletter begint. Dat moet je niet in de code afdwingen, maar gewoon in je hoofd.

Zo is het in veel gevallen ook volkomen doelloos om het mooi maken van een message af te dwingen. Bijv. in het geval die jij hier gaf. De exception is "The file ' . $file . ' could not be written." dat het een FileSystemException is weet je al dat het een exception van de FileSystem is. Dat je er dan in de logs "The FileSystem experienced an exception:" erbij wilt hebben staan moet je in het catch gedeelte (het handle gedeelte) oplossen.

Je zit een exception nog steeds verkeerd naar mijn mening en ik vind het je heel moeilijk om je wel op het goede spoor te krijgen. Laten we nog maar een vergelijking starten, kijken of je het dan wel door krijgt:

Een Exception is vertaald "uitzondering". Er gebeurd iets wat een uitzondering is op de verwachte gebeurtenissen. In programmeren is iets wat anders is dan dat je verwachte fout.
Deze fout wil je doorgeven aan de rest van je applicatie. Dat doe je dus door alleen die uitzondering naar iedereen door te gooien, niet door allerlei andere informatie erbij te stoppen. Pas degene die de uitzondering van jouw aanhoort (catched) gaat beslissen wat hij er mee gaat doen.

Stel ik heb mijn been gebroken en ik lig op straat. Dan zit ik niet te schreeuwen "Wouter heeft zijn been gesproken op de gemeenlandslaan in Huizen voor huisnummer 58." Nee, het enige wat je mij hoort schreeuwen is "Ik heb mijn been gebroken!". Dat is de Exception.
Vervolgens komt er een voorbijganger aangehold die mijn geschreeuw heeft gehoord en mij wil helpen (de catcher). Deze weet dat ik Wouter heet (wat iedereen heeft natuurlijk een naamkaartje, in de OO wereld in elk geval wel). Vervolgens gaat deze voorbijganger 112 bellen voor een ambulance, daarin geeft hij door "Ik ben op de gemeenlandslaan 58 en iemand heeft hier zijn been gebroken." Vervolgens belt hij ook mijn ouders en zegt: "Wouter heeft zijn been gebroken." Zie je het grappige? Deze voorbijganger (de catcher) geeft deze extra informatie wel door, aangezien degene aan wie hij het doorgeeft deze informatie nodig heeft.

Zo werkt het ook in de OO wereld. De FileSystem class ligt op straat te schreeuwen "Ik kan bestand $file niet ophalen!" Een catcher die voorbij komt denkt: "Hé, ik weet hoe ik hem kan helpen." Vervolgens zorgt hij dat de logger informatie krijgt over welke klasse de exception gooide, wat voor exception en wat het bericht was. Ook geeft hij, indien hij in de debug mode zit, door aan een exception printer dat er een exception is geweest, welke exception, de message en de stacktrace.
 
Ozzie PHP

Ozzie PHP

02/11/2013 15:24:54
Quote Anchor link
Ha, kijk Wouter. Dat is een duidelijk voorbeeld. Alleen het heeft voor mij nog even wat verduidelijking nodig. Stel ik gooi een exception:

throw new Exception('The file ' . $file . ' could not be written'.);

Stel dat ik dit zou loggen. Dan zie ik in de log alleen staan: The file 'foo.php' could not be written.

Dan moet ik toch ook zien welke exception class die exception heeft gegooid? En moet ik dan vanuit de catch aangeven vanuit welke class dat is gebeurd?

Kun je anders eens een (heel simpel) voorbeeldje geven van wat jij in het catch-blok zou zetten?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
try {
  // bestand opslaan
} catch (FileSystemException $e) {

  // wat komt hier dan te staan?

}

?>
 
NOLot -

NOLot -

02/11/2013 15:46:56
Quote Anchor link
throw new Exception('The file ' . $file . ' could not be written\nStack: '. $e->getTraceAsString()); ?

Edit: waarom zou je de exceptie uberhaupt willen catchen? Als hij niet kan schrijven naar een bestand, en die logica is belangrijk voor het vervolg van mijn applicatie, zou ik juist willen dat hij op zn bek gaat
Gewijzigd op 02/11/2013 15:49:07 door NOLot -
 
Wouter J

Wouter J

02/11/2013 15:57:25
Quote Anchor link
Nolot, beide fout.

De stack trace kun je op halen uit de exception klasse, die hoort niet bij se exception. Zien welke klasse de exception gooit kun je uit de stack trace halen en als het goed is kun je dit zien aan de classname van de exception.

Deze exception wil je catchen omdat ik niet een hele app wil laten crashen omdat de cache niet werkte. Ik zal alleen willen opslaan dat het niet werkte, zodat ik het later kan gaan debuggen.

Ozzie, voorbeeldje komt eraan!
 
Ozzie PHP

Ozzie PHP

02/11/2013 16:01:21
Quote Anchor link
>> Ozzie, voorbeeldje komt eraan!

Top!
 
NOLot -

NOLot -

02/11/2013 16:30:13
Quote Anchor link
Wouter J op 02/11/2013 15:57:25:
Nolot, beide fout.

De stack trace kun je op halen uit de exception klasse, die hoort niet bij se exception. Zien welke klasse de exception gooit kun je uit de stack trace halen en als het goed is kun je dit zien aan de classname van de exception.

Deze exception wil je catchen omdat ik niet een hele app wil laten crashen omdat de cache niet werkte. Ik zal alleen willen opslaan dat het niet werkte, zodat ik het later kan gaan debuggen.

Ozzie, voorbeeldje komt eraan!


Eigenlijk was het hele punt dat elke exceptie een getTrace methode heeft.

En als je goed leest dan zie je dat ik zeg "en die logica is belangrijk voor het vervolg van mijn applicatie". Ik wist niet dat het om een cache verhaal ging

@Ozzie waarom je je uberhaupt bezig houdt met het cachen van dingen terwijl je de basis van oo nog niet eens onder de knie hebt snap ik niet. Weet je wel dat zeker 90% van de vragen die je stelt opgelost zouden kunnen worden als je eens een weekje de tijd nam om object oriented programming te leren? Daarna zou je dan eens verder kunnen gaan met vette dingen maken
 
Wouter J

Wouter J

02/11/2013 16:36:04
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
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php

class FileCacher extends AbstractCacher
{
    // ...

    public function doCache($data)
    {

        try {
            $this->filesystem->write($this->filename, $data);
        }
catch (FileSystemException $e) {
            // that's bad, all my speed optimalisation topics on phphulp are now useless...

            // let's log it, so Ozzie can start fixing this in a hurry

            $this->logger->warning(
                sprintf(
                    'The FileCacher experienced a problem with dataset %s and file %s: %s',
                    json_encode($data),
                    $this->filename,
                    $e->getMessage()
                )
            );


            ExceptionHandler::handle($e);
        }
    }
}


class ExceptionHandler
{
    static public function handle(\Exception $e)
    {

        if (self::$debug) {
            echo $this->templating->render('Ozzie:Core:exception.html.twig', array(
                'message' => $e->getMessage(),
                'stacktrace' => $e->getTraceAsString(),
                'exception_class' => get_class($e),
            ));


            exit();
        }
    }
}

?>
 
Ozzie PHP

Ozzie PHP

02/11/2013 21:07:41
Quote Anchor link
@Wouter: thanks voor het voorbeeld. Ik ben even benieuwd waar jij $this->logger vandaan tovert. Ik zou verwachten dat je een log functie in je "default" Exception class inbouwt en dat je dan dit doet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
} catch (FileSystemException $e) {
  $e->log('... hier de log message');
}

?>

Als kritische opmerking vraag ik me wel af... waarom verwerk je "ExceptionHandler::handle($e);" niet in de log functie van de Exception class? Dus normaal gesproken loggen... maar op het moment dat je in debug-mode zit, toon je direct de error-message. Is dat niet handiger dan bij iedere Exception nog een keer die exception handler aan te roepen?

@NOLot: jammer dat je zegt dat ik de basis dingen niet onder de knie heb. Je kunt beter iets opbouwends en stimulerends zeggen. Ik heb nooit met Exceptions gewerkt, en wil graag het principe onder de knie krijgen. En aan je eigen voorbeeld te zien, heb je dat zelf ook nog niet helemaal onder de knie. Iedereen komt hier om iets te leren. Je advies zal best goed bedoeld zijn, maar ik schiet er niet veel mee op.
Gewijzigd op 02/11/2013 21:08:11 door Ozzie PHP
 
Wouter J

Wouter J

02/11/2013 23:24:50
Quote Anchor link
>> Ik zou verwachten dat je een log functie in je "default" Exception class inbouwt en dat je dan dit doet:

Oe, ozzie. Je begrijpt het nog steeds niet, dan maar over op de radicale methode: De exception klasse mag geen 1 actie uitvoeren, hij mag alleen data vasthouden over de error.

Ik die krijsend op de grond lig door mijn gebroken been ga je toch niet gebruiken om 112 te bellen? Nee, je gebruikt je eigen mobiel, die je zojuist bij het vertrekken van huis in je broekzak geïnjecteerd hebt.

Dus hoe kom ik aan de logger service? Juist ja, door te injecteren via de controller.

>> Je advies zal best goed bedoeld zijn, maar ik schiet er niet veel mee op.

Dan begrijp je zijn advies verkeerd, want er zit een hele grote kern van waarheid in. Je stelt nu al zo'n 1.5 jaar vragen over OO en eigenlijk schiet je niet heel veel op. De forum gebruikers steken veel tijd om jou 1 OO aspect te leren, waarna we dit over een half jaar weer precies hetzelfde mogen doen. Ik kan bijna al je OO vragen van nu beantwoorden met een linkje van een topic van jou vroeger, dat doe ik niet omdat de zoekfunctie van het forum zo slecht is.
Als je nou eens een maantje steekt in het lezen van een goed oo boek en het doorhebben van de basis principen en design patterns zal je over een jaar je framework afhebben. Op deze manier blijft het alleen bij nadenken.
 

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