Vaikea kysymys

Lukasimpas yhen oppaan siin kehotettiin käyttämään poikkeuksia (try ja catch) jos ohjelmoi olioiden kans.

Tähän mennessä olen tehnyt näin

if (!$_GET['email']) {
error('email puuttuu');
}

Mites tuo sama tehdään poikkeuksien kanssa? Että error functiolle välitetään tuo tieto?

Ja muutenkin kannattaako noitten poikkeuksien käyttöä opetella vai pärjääkö ihan if jutuil?


Poikkeukset on siis
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

Jos siitä kiikastaa miks vastauksia ei kuulu
11569
Äänestä

Muut lukivat myös

Vastaukset 11

Vanhimmat

Yleisesti ottaen joka kielessä joka tukee sitä try -> catch on suositeltavampi virhetilanteiden käsittelyyn kuin pelkkä if in käyttö ja kuuluu hyviin koodaustapoihin. Esim if lauseessa jos itse if lause kaatuu niin siitä et saa infoa mitenkään.

Eli try n sisään kaikki mikä saattaa aiheuttaa virhetilanteen, tai virheellisen toiminnan ohjelmassa. Voit myös tehdä omia poikkeusluokkia periyttämällä oman luokkasi Exception luokasta.

Yksi tapa käyttää poikkeuksia on ohjata ohjelman toimintaa niitten avulla, exception=poikkeus ei välttämättä siis varsinainen virhetilanne.

Catch osioita voi olla useita peräkkäin joilla saat kiinni useamman tyyppisiä poikkeuksia, omia tai valmiita, yleinen käyttö on erikoisemmat poikkeuset ensin ja viimeisenä juuriexception eli catch (Exception $e). Lisäksi voit itse "heittää" poikkeuksen omien tarkistuksien jälkeen throw lla.

Poikkeuksien käsittely ja käyttö on melkein oma taiteenlajinsa jota on vaikea lyhyesti selittää. Toivottavasti tämä selvensi edes vähän :)

Lisätietoa php n Exception käsittelystä löytyy mm

http://fi.php.net/manual/en/language.exceptions.php

esimerkissäsi error funktio tulisi näin

try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
Error('Connection failed: ' . $e->getMessage());
}

Äänestä
  • Kiitoksia todella paljon tuo selventi asiaa. Mutta viel olis pari kysymyst.

    Onko poikkeuksien hankaluus/sekavuus suurin syy miksi niitä näkee vähän käytettävän ainakin PHP scripteissä?
    Jostain lukasin tosin että vasta PHP5 nämä hienoudet tuli joka osaltaan selittäisi käytön vähyyden.

    Sitten toinen kysymys jos käyttää try niin ilmeisesti silloin catch on pakollinen vaikka olisi määritellyt oman error käsittelijän set_exception_handler('exception_handler');

    Pelkkä throw new Exception('Virhe kyselyssä'); menee kyl suoraan tuolle exception_handler functiolle.

    Muutaman tunnin kokeilujen jälkeen nämä poikkeukset vaikuttaa huomattavasti monipuolisemmalta kuin aikasempi if/else functio sähellys virheiden käsittelyssä. Mutta kyllä tässä viel opittavaa riittää.

    Äänestä

  • Joerww kirjoitti:

    Kiitoksia todella paljon tuo selventi asiaa. Mutta viel olis pari kysymyst.

    Onko poikkeuksien hankaluus/sekavuus suurin syy miksi niitä näkee vähän käytettävän ainakin PHP scripteissä?
    Jostain lukasin tosin että vasta PHP5 nämä hienoudet tuli joka osaltaan selittäisi käytön vähyyden.

    Sitten toinen kysymys jos käyttää try niin ilmeisesti silloin catch on pakollinen vaikka olisi määritellyt oman error käsittelijän set_exception_handler('exception_handler');

    Pelkkä throw new Exception('Virhe kyselyssä'); menee kyl suoraan tuolle exception_handler functiolle.

    Muutaman tunnin kokeilujen jälkeen nämä poikkeukset vaikuttaa huomattavasti monipuolisemmalta kuin aikasempi if/else functio sähellys virheiden käsittelyssä. Mutta kyllä tässä viel opittavaa riittää.

    Suurin syy poikkeuksien vähyyteen lienee mainitsemasi seikka että vasta php 5 tuli Exception luokka käyttöön. Toisena syynä on yksinkertaisesti kunnon virheenkäsittelyn puuttuminen koodista, joka on valitettavan yleistä, lie syynä sitten laiskuus tai vain tietämättömyys. Tässä täytyy myös muistaa että poikkeuksiakin voi käyttää väärin (liikaa), niitä ei kannata laittaa joka koodirivin tarkistukseen. Vaikka se sinällään olisi ihan mukavaa niin luettavuus kärsii liikaa lopullisessa koodissa.

    Taitaa olla niin että php ssäkin try vaatii catch in parikseen, tosin koodin lukuakin selkeyttää kun paikallaan on aina try -> catch.

    Poikkeukset ovat tosiaan monipuolisia, suosittelen opettelemaan vielä oman poikkeusluokan periyttämisen valmiista poikkeuksista. If/else ei pääse samalle tasolle poikkeuksien kanssa koska poikkeukset on erikoistettu nimenomaan virhetoiminnan ja virheiden käsittelyyn.

    Lisäksi if/else haarat ovat huomattavasti epäselvempiä ko hommaan, varsinkin kun katsot koodiasi joskus parin kk jälkeen sen teosta. Try & catch on huomattavasti selkeämpi, lohko josta tiedät heti että tässä kohtaa voi tulla joku poikkeus.

    Yksi hyvä puoli poikkeuksissa on että kun kerran opettelet käytön niin osaat käyttää niitä muissakin kielissä. Kielestä riippuen mukaan kuvioihin tulee vielä try -> finally lohko joka voi sisältää myös catch ejä, mutta perussysteemi pysyy samana jos vain kieli tukee poikkeuksien käsittelyä.

    Äänestä

  • Joerww kirjoitti:

    Kiitoksia todella paljon tuo selventi asiaa. Mutta viel olis pari kysymyst.

    Onko poikkeuksien hankaluus/sekavuus suurin syy miksi niitä näkee vähän käytettävän ainakin PHP scripteissä?
    Jostain lukasin tosin että vasta PHP5 nämä hienoudet tuli joka osaltaan selittäisi käytön vähyyden.

    Sitten toinen kysymys jos käyttää try niin ilmeisesti silloin catch on pakollinen vaikka olisi määritellyt oman error käsittelijän set_exception_handler('exception_handler');

    Pelkkä throw new Exception('Virhe kyselyssä'); menee kyl suoraan tuolle exception_handler functiolle.

    Muutaman tunnin kokeilujen jälkeen nämä poikkeukset vaikuttaa huomattavasti monipuolisemmalta kuin aikasempi if/else functio sähellys virheiden käsittelyssä. Mutta kyllä tässä viel opittavaa riittää.

    Tästä vielä sen verran että tämä tapa käsitellä poikkeuksia poikkeaa try -> catch tavasta. Tällä ylitetään poikkeustenkäsittelijäksi joku oma funktio. Php sivuilta:

    Sets the default exception handler if an exception is not caught within a try/catch block. Execution will stop after the exception_handler is called.

    Eli suomeksi käyttäisin tätä lähinnä debuggaus vaiheessa, lopullisessa versiossa korvaisin tarvittavat kohdat try -> catch lohkoilla. Löysin lisäksi tällaisen selventämään asiaa:

    http://www.andreashalter.ch/phpug/20040115/

    Kohtuu hyvä yleiskuvaus poikkeuksista ja niiden käytöstä ja omien poikkeuksien teosta myös ohjelman logiikan ohjaukseen, ei vain varsinaisena virhetilanteena, kts SpeedLimitReachedException.

    Kuten tuolla sivuilla on sanottu try exception lohkoa ei pitäisi käyttää yksinään vaan muun virhetoimintalogiikan kanssa. Esim ensimmäisen viestisi koodi menisi try catch illa jotenkin näin

    try {
    if (!$_GET['email']) {
    throw new Exception("email puuttuu");
    }
    }
    catch (Exception $e) {
    error($e->getMessage());
    }


    Eli sinällään if tarkistus ei häviä tuosta mihinkään. Tämä koodin pätkä voi näyttää myös hieman turhalta, mutta kun teet omia erikoistuneempia poikkeusluokkia tämäkin selkenee.

    Oma EmailMissingException luokka jonka message ssa on "email puuttuu" saamme edellisestä:

    try {
    if (!$_GET['email']) {
    throw new EmailMissingException();
    }
    }
    catch (EmailMissingException $ee) {
    echo $ee->getMessage();
    }
    catch (Exception $e) {
    echo $e->getMessage();
    }

    Eli tässähän näkyy sitten jo selkeä ero pelkän juuriexception käyttöön nähden ja myös se seikka ttä järkeä kannattaa käyttää milloin käyttää poikkeuksia ja milloin ei. Tämmöisenään tuo koodi olisi aika rajatapaus koska oma poikkeus on tällä hetkellä käytössä vain yhdessä paikassa ja sisältää vain custom viestin. Selkeämpi olisi vain yksinkertainen if käsittely.

    Äänestä

  • PIProd kirjoitti:

    Tästä vielä sen verran että tämä tapa käsitellä poikkeuksia poikkeaa try -> catch tavasta. Tällä ylitetään poikkeustenkäsittelijäksi joku oma funktio. Php sivuilta:

    Sets the default exception handler if an exception is not caught within a try/catch block. Execution will stop after the exception_handler is called.

    Eli suomeksi käyttäisin tätä lähinnä debuggaus vaiheessa, lopullisessa versiossa korvaisin tarvittavat kohdat try -> catch lohkoilla. Löysin lisäksi tällaisen selventämään asiaa:

    http://www.andreashalter.ch/phpug/20040115/

    Kohtuu hyvä yleiskuvaus poikkeuksista ja niiden käytöstä ja omien poikkeuksien teosta myös ohjelman logiikan ohjaukseen, ei vain varsinaisena virhetilanteena, kts SpeedLimitReachedException.

    Kuten tuolla sivuilla on sanottu try exception lohkoa ei pitäisi käyttää yksinään vaan muun virhetoimintalogiikan kanssa. Esim ensimmäisen viestisi koodi menisi try catch illa jotenkin näin

    try {
    if (!$_GET['email']) {
    throw new Exception("email puuttuu");
    }
    }
    catch (Exception $e) {
    error($e->getMessage());
    }


    Eli sinällään if tarkistus ei häviä tuosta mihinkään. Tämä koodin pätkä voi näyttää myös hieman turhalta, mutta kun teet omia erikoistuneempia poikkeusluokkia tämäkin selkenee.

    Oma EmailMissingException luokka jonka message ssa on "email puuttuu" saamme edellisestä:

    try {
    if (!$_GET['email']) {
    throw new EmailMissingException();
    }
    }
    catch (EmailMissingException $ee) {
    echo $ee->getMessage();
    }
    catch (Exception $e) {
    echo $e->getMessage();
    }

    Eli tässähän näkyy sitten jo selkeä ero pelkän juuriexception käyttöön nähden ja myös se seikka ttä järkeä kannattaa käyttää milloin käyttää poikkeuksia ja milloin ei. Tämmöisenään tuo koodi olisi aika rajatapaus koska oma poikkeus on tällä hetkellä käytössä vain yhdessä paikassa ja sisältää vain custom viestin. Selkeämpi olisi vain yksinkertainen if käsittely.

    Ensiksi jälleen suuri kiitos.

    Tarkoitus oli että määritän set_exception_handler('exception_handler') ja sitten esim tietokanta luokassa throw new Exception("käyttäjälle näkyvä ilmoitus") jos kysely tai jokin muu epäonnistuu.

    Sitten exception_handler-functio tulostaisi käyttäjälle ilmoituksen ja logittaisi virheen tarvittavine tietoineen jotta se olisi helppo myöhemmin paikallistaa.

    Tällöin koodissa tarvitsisi vain
    $db->query("SELECT ...."); ja luokka hoitaisi automaattisesti oletus virheiilmoitukset ja käsittelyn. Tämä usein riittää.

    Ja jos tarvitsesin oletuksesta poikkeevaa tapaa virheiden käsittelyyn niin silloin käyttäisin koodissa try/catch.

    Tarkoituksena on saada mahdollisimman helppokäyttöinen virheenkäsittely joka tekee oletuksena paljon asioita ilman että koodissa niitä erikseen määrään, mutta tarvittaessa helppo muuttaa.

    Ilmeisesti tämä ei olekkaan hyvä keino?

    Vai kannattaisiko miettiä että esim tietokanta virheille olisi oma luokka samoin muillekkin virhepäätyypeille?

    Nuo termit voi sit olla mitä sattuu kun vasta opettelen oliojuttuja.

    Äänestä

  • Joerww kirjoitti:

    Ensiksi jälleen suuri kiitos.

    Tarkoitus oli että määritän set_exception_handler('exception_handler') ja sitten esim tietokanta luokassa throw new Exception("käyttäjälle näkyvä ilmoitus") jos kysely tai jokin muu epäonnistuu.

    Sitten exception_handler-functio tulostaisi käyttäjälle ilmoituksen ja logittaisi virheen tarvittavine tietoineen jotta se olisi helppo myöhemmin paikallistaa.

    Tällöin koodissa tarvitsisi vain
    $db->query("SELECT ...."); ja luokka hoitaisi automaattisesti oletus virheiilmoitukset ja käsittelyn. Tämä usein riittää.

    Ja jos tarvitsesin oletuksesta poikkeevaa tapaa virheiden käsittelyyn niin silloin käyttäisin koodissa try/catch.

    Tarkoituksena on saada mahdollisimman helppokäyttöinen virheenkäsittely joka tekee oletuksena paljon asioita ilman että koodissa niitä erikseen määrään, mutta tarvittaessa helppo muuttaa.

    Ilmeisesti tämä ei olekkaan hyvä keino?

    Vai kannattaisiko miettiä että esim tietokanta virheille olisi oma luokka samoin muillekkin virhepäätyypeille?

    Nuo termit voi sit olla mitä sattuu kun vasta opettelen oliojuttuja.

    Tämä menee hieman jo makuasioiden puolelle ;) Ajattelemasi tapa on sinällään oikein sekin (ja paljon parempi kun ei mitään) jos halutaan helppoa & nopeaa ratkaisua. Lisäksi tämä riippuu koodaus tavastasi, jos koodaat olio-ohjelmointia noudattaen tämä tapa on enemmän proseduuriohjelmoinnin keinoja..

    >Vai kannattaisiko miettiä että esim tietokanta >virheille olisi oma luokka samoin muillekkin >virhepäätyypeille?

    Näin tekisin tämän itse. Kun teet jotain muita ohjelmia saisit näistä luokista sitten suoraan poikkeukset tuleviin ohjelmiisi :)

    Äänestä

  • PIProd kirjoitti:

    Tämä menee hieman jo makuasioiden puolelle ;) Ajattelemasi tapa on sinällään oikein sekin (ja paljon parempi kun ei mitään) jos halutaan helppoa & nopeaa ratkaisua. Lisäksi tämä riippuu koodaus tavastasi, jos koodaat olio-ohjelmointia noudattaen tämä tapa on enemmän proseduuriohjelmoinnin keinoja..

    >Vai kannattaisiko miettiä että esim tietokanta >virheille olisi oma luokka samoin muillekkin >virhepäätyypeille?

    Näin tekisin tämän itse. Kun teet jotain muita ohjelmia saisit näistä luokista sitten suoraan poikkeukset tuleviin ohjelmiisi :)

    Tarkemmin ajatellen tuo set_exceptionhandler ei olekaan proseduuriohjelmointia vaan lähenee aspekti ohjelmointia (jos se toimii noin kun kuvasit) joka taas on täysin oma asiansa mutta sinänsä käytössä olioitten kanssa. Väsyneenä ei kaikkea heti huomaa ;)

    Äänestä

  • PIProd kirjoitti:

    Tarkemmin ajatellen tuo set_exceptionhandler ei olekaan proseduuriohjelmointia vaan lähenee aspekti ohjelmointia (jos se toimii noin kun kuvasit) joka taas on täysin oma asiansa mutta sinänsä käytössä olioitten kanssa. Väsyneenä ei kaikkea heti huomaa ;)

    Tää mun ohjelmointi on tämmöstä sekametelisoppaa suurin osa tehty functiolla, mutta pikkuhiljaa olioita tulee enempi mukaan kunhan opin.

    Taas aivoitukset hieman muuttunu kun tuota haluamaani juttua en saanut toimimaan kunnol. Tai periaatteessa toimikin, mutta pitemmänpäälle aika sekava kun osa virheistä menisi suoraa exception_handler functiolle ja toiset taas ei.... Ei sitä kuitenkaan myöhemmin muistaisi miten se olikaan.

    Joten kokeillaampas tuota toista tapaa jota suosittelit. Mutta tähän liittyy ehkä muutama tyhmä kysymyskin.

    Kannattaisiko nuo eri virheluokat yhdistää yhdeksi? Tämä luokka sisältäisi sitten functiot virhepäätyypeille joita sitten kutsuisin.

    Miten noita luokkia kuuluu kutsua oikeaoppisesti tämmösissä tapauksissa?
    ihan vaan
    ..
    catch (Exception $e) {
    new db_error($e);
    }

    Vai kannattaako luokka esitellä sivun alussa
    $db_error = new db_error; ja sitten käyttää normaaliin tapaan.

    Äänestä

  • Joerww kirjoitti:

    Tää mun ohjelmointi on tämmöstä sekametelisoppaa suurin osa tehty functiolla, mutta pikkuhiljaa olioita tulee enempi mukaan kunhan opin.

    Taas aivoitukset hieman muuttunu kun tuota haluamaani juttua en saanut toimimaan kunnol. Tai periaatteessa toimikin, mutta pitemmänpäälle aika sekava kun osa virheistä menisi suoraa exception_handler functiolle ja toiset taas ei.... Ei sitä kuitenkaan myöhemmin muistaisi miten se olikaan.

    Joten kokeillaampas tuota toista tapaa jota suosittelit. Mutta tähän liittyy ehkä muutama tyhmä kysymyskin.

    Kannattaisiko nuo eri virheluokat yhdistää yhdeksi? Tämä luokka sisältäisi sitten functiot virhepäätyypeille joita sitten kutsuisin.

    Miten noita luokkia kuuluu kutsua oikeaoppisesti tämmösissä tapauksissa?
    ihan vaan
    ..
    catch (Exception $e) {
    new db_error($e);
    }

    Vai kannattaako luokka esitellä sivun alussa
    $db_error = new db_error; ja sitten käyttää normaaliin tapaan.

    >Kannattaisiko nuo eri virheluokat yhdistää yhdeksi?

    Ei missään tapauksessa, samaan php tiedostoon ehkä jos niitä on vähän ja ne ovat lyhyitä. Jos poikkeusia tulee paljon niin itse tekisin Exception hakemiston ja sen sisälle kaikki omat poikkeusluokat eri tiedostoihin. Toki voit käyttää yleisiä poikkeusluokkia sillon kun ne ovat järkeviä, esim vääräntyyppinen henkilönnimi, henkilönsposti input tieto voidaan yhdistää yhteen poikkeusluokkaan joka palauttaa vain "invalid input". Mutta muuten kannattaa erikoistaa skaalautumisen takia, voit muuttaa tapauskohtaisesti käsittelyä milloin tarpeen. Sitä paitsi jos käytät vain yhtä poikkeusluokkaa niin et (ehkä) tarvitse omia luokkia, käytä suoraan valmista Exception luokkaa.

    Valmiita poikkeusluokkia en äkkiseltään etsimällä löytänyt, joten näyttäisi että php on vähän lapsenkengissä vielä näiden kanssa. Joka tarkoittaa lähinnä vain sitä että joutuu itse tekemään esim mysql poikkeukset (empty result ym) ja nollalla jaot ym, mutta tämähän olisi pakko joka tapauksessa jos haluaa esim lokalisoida tekstejä.

    Luokkia ei tehdä ehdottamallasi tavalla $asd = new asd();
    Näyttäisi että sinulla on hieman hakusessa vielä nämä luokat niin täällä esim voi tutustua asiaan

    http://www.php.net/manual/en/language.oop5.php
    http://www.php.net/manual/en/language.exceptions.php

    Alemmassa Exception luokka ja esimerkkejä miten periytetään siitä oma luokka. Käyttö tapahtuu kuten Exception ia käytettäessä, kuten aiemmassa viestissäni oli:

    Oma EmailMissingException luokka jonka message ssa on "email puuttuu":

    try {
    if (!$_GET['email']) {
    throw new EmailMissingException();
    }
    }
    catch (EmailMissingException $ee) {
    echo $ee->getMessage();
    }
    catch (Exception $e) {
    echo $e->getMessage();
    }


    Tuossa EmailMissingException luokassa voit sitten määritellä haluamiasi toimintoja. Tietenkin catchin sisällä voit tehdä mitä haluat, mm delegoida viestin lähettämisen toisille luokille/olioille.

    Äänestä

  • PIProd kirjoitti:

    >Kannattaisiko nuo eri virheluokat yhdistää yhdeksi?

    Ei missään tapauksessa, samaan php tiedostoon ehkä jos niitä on vähän ja ne ovat lyhyitä. Jos poikkeusia tulee paljon niin itse tekisin Exception hakemiston ja sen sisälle kaikki omat poikkeusluokat eri tiedostoihin. Toki voit käyttää yleisiä poikkeusluokkia sillon kun ne ovat järkeviä, esim vääräntyyppinen henkilönnimi, henkilönsposti input tieto voidaan yhdistää yhteen poikkeusluokkaan joka palauttaa vain "invalid input". Mutta muuten kannattaa erikoistaa skaalautumisen takia, voit muuttaa tapauskohtaisesti käsittelyä milloin tarpeen. Sitä paitsi jos käytät vain yhtä poikkeusluokkaa niin et (ehkä) tarvitse omia luokkia, käytä suoraan valmista Exception luokkaa.

    Valmiita poikkeusluokkia en äkkiseltään etsimällä löytänyt, joten näyttäisi että php on vähän lapsenkengissä vielä näiden kanssa. Joka tarkoittaa lähinnä vain sitä että joutuu itse tekemään esim mysql poikkeukset (empty result ym) ja nollalla jaot ym, mutta tämähän olisi pakko joka tapauksessa jos haluaa esim lokalisoida tekstejä.

    Luokkia ei tehdä ehdottamallasi tavalla $asd = new asd();
    Näyttäisi että sinulla on hieman hakusessa vielä nämä luokat niin täällä esim voi tutustua asiaan

    http://www.php.net/manual/en/language.oop5.php
    http://www.php.net/manual/en/language.exceptions.php

    Alemmassa Exception luokka ja esimerkkejä miten periytetään siitä oma luokka. Käyttö tapahtuu kuten Exception ia käytettäessä, kuten aiemmassa viestissäni oli:

    Oma EmailMissingException luokka jonka message ssa on "email puuttuu":

    try {
    if (!$_GET['email']) {
    throw new EmailMissingException();
    }
    }
    catch (EmailMissingException $ee) {
    echo $ee->getMessage();
    }
    catch (Exception $e) {
    echo $e->getMessage();
    }


    Tuossa EmailMissingException luokassa voit sitten määritellä haluamiasi toimintoja. Tietenkin catchin sisällä voit tehdä mitä haluat, mm delegoida viestin lähettämisen toisille luokille/olioille.

    *Luokkia ei tehdä ehdottamallasi tavalla $asd = new asd();
    Näyttäisi että sinulla on hieman hakusessa vielä nämä luokat niin täällä esim voi tutustua asiaan.....*

    Hmmm.... tarkoitin luokkien esittelyä tai mitälie nimeä siitä käytetään näin ainakin oppaista olen ymmärtänyt. Kyl on hakuses viel nää jutut.

    Tosin tarkemmin noita linkkejä ja esimerkkiäsi tutkin niin tuo asia hieman selvisi. Voin siis tehdä suoraan näin.
    ...
    catch (EmailMissingException $ee) {
    $ee->logita();
    }

    Ja sitten tuossa Email.. luokassa oleva logita functio tekee tarvittavat toimet logittamiseen. Vai oliskos sittenkin järkevämpää että tuo luokka tekisi sen automaattisesti?

    Äänestä

  • Joerww kirjoitti:

    *Luokkia ei tehdä ehdottamallasi tavalla $asd = new asd();
    Näyttäisi että sinulla on hieman hakusessa vielä nämä luokat niin täällä esim voi tutustua asiaan.....*

    Hmmm.... tarkoitin luokkien esittelyä tai mitälie nimeä siitä käytetään näin ainakin oppaista olen ymmärtänyt. Kyl on hakuses viel nää jutut.

    Tosin tarkemmin noita linkkejä ja esimerkkiäsi tutkin niin tuo asia hieman selvisi. Voin siis tehdä suoraan näin.
    ...
    catch (EmailMissingException $ee) {
    $ee->logita();
    }

    Ja sitten tuossa Email.. luokassa oleva logita functio tekee tarvittavat toimet logittamiseen. Vai oliskos sittenkin järkevämpää että tuo luokka tekisi sen automaattisesti?

    >Vai oliskos sittenkin järkevämpää että tuo luokka >tekisi sen automaattisesti?

    Tämä on lähinnä makukysymys, tee miten tuntuu / näyttää loogiselta. Ehdottamasi logita() -metodi näyttäisi koodissa mitä se tekee, toisaalta tämän metodin kutsuminen oman exceptionin constructissa piilottaisi käsittelyn logiikan joka on myös hyvä tapa.

    Äänestä

Kommentoi aloitusta


Joerww kirjoitti:

Lukasimpas yhen oppaan siin kehotettiin käyttämään poikkeuksia (try ja catch) jos ohjelmoi olioiden kans.

Tähän mennessä olen tehnyt näin

if (!$_GET['email']) {
error('email puuttuu');
}

Mites tuo sama tehdään poikkeuksien kanssa? Että error functiolle välitetään tuo tieto?

Ja muutenkin kannattaako noitten poikkeuksien käyttöä opetella vai pärjääkö ihan if jutuil?


Poikkeukset on siis
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

Jos siitä kiikastaa miks vastauksia ei kuulu

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu