[php] return true/false of throw exception

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
ik heb de volgende classe
PHP:
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
45
<?
require_once(dirname(__FILE__) . "/../globalConfig.php");

class category extends Explorer
{
    protected $id = null;

    //Open cat from database
    public function open($id)
    {
        $mysqli = $this->dbConnect();
        $result = $mysqli->query("SELECT * FROM " . _CATEGORIES . " WHERE cat_id = '" . $id . "'");
        
        if($mysqli->error) 
        {
            return false; //throw new Exception("MySQL error $mysqli->error \n $mysqli->errno");
        }
        else
        {
            if($result->num_rows == 1)
            {
                //stop data in object of array
            }
            else return false; //throw new Exception("Tabel is leeg");
        }
        
        $result->close();
        $mysqli->close();
    }
    
    //Open cat content from database
    public function open_cat_content($id=0)
    {
        if($this->open($this->id) == false)
        {
            $this->id = $id;
            $this->parent_id = 0;
        }

//haal nog wat andere data op, prop het in array contents

        return $this->contents;
    }
}
?>


binnen de methode open_cat_content wil ik graag checken of de database inhoud bevat overeenkomend het ID ($this->open(ID)), dit kan het beste met het returnen van true or false.

echter vanuit een functie buiten de klasse, wil ik graag een degelijk foutafhandeling hebben:
PHP:
1
2
3
4
5
6
7
try 
{
    $category = new category();
    $category->open(5);
//print data uit object
}
catch(Exception $e){print $e->getError();}


hoe kan ik deze twee methodes het beste combineren, of is het juist onzinnig om exceptions te gebruiken in deze opzet? OF kan ik de exceptions binnen de klasse al afvangen? In plaats van checken op true or false.

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
In PHP kan je doodsimpel een functie maken die jouw foutmeldingen afhandelt. Volledig naar eigen smaak te bouwen. Ik doe het op de volgende manier:
PHP:
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
class DummyClass {

    public function __construct() 
    {
    
        @set_exception_handler(array('DummyClass', 'exception_handler'));       
    }
    
    // De default exeption handler
    public static function exception_handler($exception) 
    { 
        // Meld de error
        echo "Er is een fout opgetreden in ". $exception->getFile() ." op lijn: ".$exception->getLine(). "<br />\n<br />\n";
        echo $exception->getMessage()."<br />\n";
        
        // Schrijf de error weg naar een bestand
        $errResource = @fopen('logs/errorLog.txt', 'a');
        
        // schrijf de error weg
        @fwrite($errResource, '['.date("d/M/Y H:i:s").' :: REQUEST-IP: '.$_SERVER['REMOTE_ADDR'].'] '.
                $exception->getMessage()."\r\n\t".$exception->getTraceAsString()."\r\n\r\n");
        
        // sluit het bestand
        @fclose($errResource);
    }
}


edit: ik zie nu dat dit eigenlijk niet helemaal je vraag dekt. Imo heeft mijn onderbuurman gelijk, als er zich een bepaalde situatie voordoet moet je niet direct een Error opgooien. Errors zijn (imo) voor als er iets fout gaat wat de applicatie belemmert verder te gaan. :)

[ Voor 13% gewijzigd door Aloys op 21-07-2009 16:04 ]


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 09:09
Dat ligt een beetje aan de context: Is het binnen je applicatie prima mogelijk dat de DB geen inhoud bevat op dat ID? Gebruik dan gewoon true/false, het is namelijk gewoon applicatieflow :)

Is het eigenlijk niet de bedoeling dat het er geen inhoud is op dat ID, en is die functie gewoon een check dan wordt het imho een exceptie: Het is een uitzonderlijke situatie die een aparte afhandeling vereist.

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 06-09 16:59

CoolGamer

What is it? Dragons?

Dat van die Exceptions heeft als voordeel dat je heel makkelijk een omschrijving van de fout erbij kan toevoegen. Dus in het geval van een MySQL-error kan het zeker handig om het als exceptie te doen, maar bijv. "Tabel is leeg" misschien niet.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
precies, maar als ik vanuit de klasse dit (zie hieronder) uitvoer en ik pas exceptions toe dan throwed hij een exception bij ID = 0, wat ik dan wil is dit binnen de methode afvangen en gewoon doorgaan met mijn script.
PHP:
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
public function open($id)
{
    $mysqli = $this->dbConnect();
    $result = $mysqli->query("SELECT * FROM " . _CATEGORIES . " WHERE cat_id = '" . $id . "'");
    
    if($mysqli->error) 
    {
        throw new Exception("MySQL error $mysqli->error \n $mysqli->errno");
    }
    else
    {
        if($result->num_rows == 1)
        {
            //stop data in object of array
        }
        else throw new Exception("Tabel is leeg");
    }
    
    $result->close();
    $mysqli->close();
}

public function open_cat_content($id=0)
{
    $this->open(0); //checken op een exception en deze afvangen, ik wil wel doorgaan met het uitvoeren van mijn script!

    $this->parent_id = 0;
    return $this->contents;
}


of kun je gewoon geen exception afvangen binnen je classe en vervolgens het script verder uitvoeren?

[ Voor 29% gewijzigd door wboard op 21-07-2009 16:29 ]

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Shagura
  • Registratie: Augustus 2001
  • Laatst online: 27-08 22:01
Sowieso is het een beetje een rare melding om te zeggen dat de "tabel leeg is". Hij hoeft namelijk helemaal niet leeg te zijn, maar er kan dus ook gewoon geen categorie zijn gevonden met cat_id = id.

Verder ligt het nog steeds totaal aan de context, echter zou ik persoonlijk in dit geval meer geneigd zijn false terug te geven (of zelfs een lege array oid). Als het echt een probleem oplevert kan alsnog een hoger object met meer applicatiekennis en mogelijkheden om te 'zien' of de applicationflow gehinderd wordt misschien een exception gooien naar aanleiding hiervan.

Je weet van te voren niet hoe je allemaal met deze methode een categorie gaat aanvragen (in theorie), misschien hoeft dit wel helemaal niet altijd uitzonderlijk te zijn en is het zelfs het meest waarschijnlijke gedrag. Persoonlijk zou ik pas exceptions gooien als je helemaal zeker weet dat een uitzonderlijke situatie zich voordoet die toch echt apart afgehandeld moet worden. En naar mijn mening weet je daar in dit voorbeeld in deze toch wel abstracte klasse niet genoeg vanaf.

Trouwens zou ik bij een MySQL error wel een exception teruggeven omdat dit toch echt duidelijk anders is.

[ Voor 5% gewijzigd door Shagura op 21-07-2009 19:31 ]


Acties:
  • 0 Henk 'm!

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Zou jij niet beter return FALSE; kunnen doen? Er treedt immers geen fout op, de query voert goed uit en heeft simpelweg geen resultaten. Dan kan de functie zijn doel niet behalen en geeft als melding: FALSE, om aan te gegeven dat het niet gelukt is? Als je bijv. een mysql_error krijgt zou je natuurlijk wel een exception kunnen opgooien. :)
Pagina: 1