Gebruik van @ o.k.?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

PHP Freak

PHP Freak

13/01/2009 11:54:00
Quote Anchor link
Beste PHP-ers,

Ik ben een Opensource applicatie aan het schrijven die ook zijn eigen foutmeldingen moet gaan genereren. Om dit te realiseren moeten niet alle PHP-errors verschijnen op het beeld, als er bijvoorbeeld een MySQL-query mislukt dan moet de error niet standaard op het scherm geprint worden(wat vaak wel gebeurt). Om dit voor elkaar te krijgen zet ik @ voor de functies die geen automatische foutmelding mogen printen.
Probleem hier is dat ik ooit heb gehoord dat het slecht is om deze foutmeldingen te onderdrukken... mijn vraag is waarom? Dat zou ik graag weten voordat ik verder ga met programmeren.
Wat ook wel handig is om te zeggen is dat ik niet de PHP_errors standaard op off wil zetten

Alvast bedankt!
 
PHP hulp

PHP hulp

26/12/2024 07:35:09
 
Jacco Engel

Jacco Engel

13/01/2009 11:57:00
Quote Anchor link
omdat je ze netjes zelf dient af te vangen;

bijv:
if(mysqli_query($link,$query))
{
echo 'kwerie gedaan' ;
}
else
{
echo 'kweerie niet gedaan' ;
}

Gr ,
Jacco

PS: Niet om af te zeiekn, maar hoe verwacht jij een goede open source app te kunnen schrijven als je niet eens weet hoe goede foutafhandeling werkt?

Ps PS: Mischien iemand die ff het try catch princiepe ckan laten zien dat kan ik namelijk niet :P

PS Ps PS: Ben ook niet vies van een goede cursus nederlands zoals te zien is :P
Gewijzigd op 01/01/1970 01:00:00 door Jacco Engel
 
Satsume

Satsume

13/01/2009 11:57:00
Quote Anchor link
Als je zeker weet dat alle errors worden afgevangen is het gebruik van @ geen probleem.

Het nadeel; Mocht je niet alle errors opvangen dan zijn de @'s die het lastig maken een fout in de code op te sporen, maar ook dan kan je je @'s uitsluiten als je de errors juist opvangt.
 
Dennis Mertens

Dennis Mertens

13/01/2009 12:04:00
Quote Anchor link
@Jacco: Spijt mij, maar ik vind het heel leuk dat jij goed weer hoe je een fout moet afhandelen in PHP. Maar bij jou ontbreekt er nogal wat aan kennis over de Nederlandse taal.
 
Jacco Engel

Jacco Engel

13/01/2009 12:06:00
Quote Anchor link
Zie de PS PS PS

@hieronder,
Lekker boeiend, iedereen begrijpt wat ik bedoel
Gewijzigd op 01/01/1970 01:00:00 door Jacco Engel
 
Dennis Mertens

Dennis Mertens

13/01/2009 12:09:00
Quote Anchor link
Dan is het altijd nog:
PS
PPS
PPPS
PPPPS

Of:

PS1
PS2
PS3
PS4 (is die al uit dan? :p)
 
PHP Freak

PHP Freak

13/01/2009 12:12:00
Quote Anchor link
met de try catch ben ik wel bekend maar bij foutopvanging als volgt:

if(mysqli_query($link,$query))
{
echo 'kwerie gedaan' ;
}
else
{
echo 'kweerie niet gedaan' ;
}

komt er alsnog gewoon een foutmelding op het beeldscherm als je bijvoorbeeld met een syntax error te maken hebt. Als je het tussen try catch blokken zet dan heb je dit toch nog steeds?
 
Jacco Engel

Jacco Engel

13/01/2009 12:15:00
Quote Anchor link
als jij een syntax error hebt is je applicatie nog niet af :P
 
Dennis Mertens

Dennis Mertens

13/01/2009 12:17:00
Quote Anchor link
Met een @ kun je geen syntax errors onder drukken.

@ zorgt ervoor dat je geen foutmeldingen krijgt als er bijvoorbeeld geen records zijn gevonden (ligt eraan wat je doet), of als de parameter niet juist is.
 
TJVB tvb

TJVB tvb

13/01/2009 12:18:00
Quote Anchor link
Je kunt een eigen error_handler schrijven en display errors uitzetten (voor een live applicatie, nooit voor testen)
Door je eigen error_handler vang je de errors op en handel je ze op een eigen manier af.
 
Robert Deiman

Robert Deiman

13/01/2009 12:28:00
Quote Anchor link
Een try/catch blok doet eigenlijk een beetje hetzelfde als de if/else constructie die je hebt staan. Alleen is zoals je het nu hebt niet een (compleet) goede manier van foutafhandeling. ->
Query niet gedaan zegt helemaal niets, wat vaak beter werkt is in een logfile (of nog handiger, log table) de mysqli_error() en de query ($query) opslaan. Dit doe je met een date/time stempel. Je kan precies zien wanneer het misging. Daarnaast kan je in een table ook heel eenvoudig kijken of dezelfde melding al een keer in de database staat. Het is een beetje jammer als iemand een meldinkje krijgt (die echo is wel prima daarvoor hoor!) en elke keer op f5 ramt dat je ook elke keer weer een nieuwe rij met die fout krijgt.

Daarnaast kan je jezelf de fout natuurlijk ook mailen, je hebt dan de weet van de fout en kan hem snel oplossen.
 
Midas

Midas

13/01/2009 12:34:00
Quote Anchor link
Het verschil tussen try/catch en if/else is in dit geval dat je na zo'n if/else nog gewoon door kunt gaan met dingen doen, bij een try/catch springt PHP meteen naar het catch blok als er een exception optreedt. Dat kan je dan weer voorkomen door er een extra try/catch blok omheen te zetten.

Lees hier alles over foutafhandeling.
 
Robert Deiman

Robert Deiman

13/01/2009 12:50:00
Quote Anchor link
@Midas

Na een Try/Catch kan je ook gewoon doorgaan hoor, je kan gewoon try/catch/try/catch gebruiken. Hij springt wel uit het blok wanneer er een fout optreed. Voor 1 try/catch blok heb je vaak iets meer if/else nodig.
 
Midas

Midas

13/01/2009 13:14:00
Quote Anchor link
@Robert,
Ik bedoel het zo:
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
try
{
    try
    {
        throw new Exception('Oeps! Een exception!');
    }

    catch(Exception $e)
    {

        echo $e->getMessage();
    }

    
    //doe iets anders
    for($i = 0; $i < 10; $i++)
    {

        echo $i;
    }
}

catch(Exception $e)
{

    echo $e->getMessage();
}

?>

Hebben we het over hetzelfde?
 
Marien xD

Marien xD

13/01/2009 14:56:00
Quote Anchor link
Het probleem met een @ is als volgt:

Als je het volgende schrijft:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
functie();
@
functieaanroep($error_aanroep);
functie();
?>


Dan maakt php in zijn parser van:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
functie();
ini_set('display_errors','off');
functieaanroep($error_aanroep);
ini_set('display_errors','on');
functie();
?>


Dit doet php voor elke @ die je plaatst. En laat nu juist de ini_set een kostbare bewerking zijn binnen PHP. Daarom word het afgeraden om het niet te doen.

Bouw gewoon een eigen error handler en zorg dat je eigen functies ook die error handler gebruiken. En dan kan je die errors afhandelen zoals je zelf wilt.
 
PHP Freak

PHP Freak

13/01/2009 16:11:00
Quote Anchor link
Ok dan bedankt voor al jullie reacties ik ga het aanpakken met een eigen errorhandler gecombineerd met de exceptionhandler van php5.
 
Joren de Wit

Joren de Wit

13/01/2009 18:06:00
Quote Anchor link
@Marien: heb je misschien enige documentatie waarin na te lezen valt dat de @ op die manier geparsed wordt? Dat zou interessant zijn, want ik kan het nergens terugvinden. Het zou in ieder geval nóg een reden zijn om @ niet te gebruiken...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Eddy E

Eddy E

13/01/2009 19:03:00
Quote Anchor link
php_ error_handler() al geprobeerd?
 
Marien xD

Marien xD

14/01/2009 10:55:00
Quote Anchor link
@blanche
Om mijn verhaal nog wat gespecificeerder te maken:

http://vega.rd.no/article/php-performance-error-suppression

In principe is mijn conclusie iets verkeerd maar de feitelijke error zal een hoop vertraging opleveren.

Na nog wat onderzoek...

http://www.php.net/manual/en/language.operators.errorcontrol.php

In de eerste comment (is laatst toegevoegd) staat dit:

Quote:
taras dot dot dot di at gmail dot com
12-Aug-2008 08:29
I was confused as to what the @ symbol actually does, and after a few experiments have concluded the following:

* the error handler that is set gets called regardless of what level the error reporting is set on, or whether the statement is preceeded with @

* it is up to the error handler to impart some meaning on the different error levels. You could make your custom error handler echo all errors, even if error reporting is set to NONE.

* so what does the @ operator do? It temporarily sets the error reporting level to 0 for that line. If that line triggers an error, the error handler will still be called, but it will be called with an error level of 0

Hope this helps someone


Misschien een ideetje om in je error_handling tutorial te integreren Blanche?
Gewijzigd op 01/01/1970 01:00:00 door Marien xD
 
Joren de Wit

Joren de Wit

14/01/2009 11:49:00
Quote Anchor link
Marien schreef op 14.01.2009 10:55:
In principe is mijn conclusie iets verkeerd maar de feitelijke error zal een hoop vertraging opleveren.
Aha, het leek me al vrij sterk dat er ongemerkt aan de php.ini geklooid zou worden. Het gaat erom dat de error_handler onnodig aangeroepen wordt :-)

Quote:
Misschien een ideetje om in je error_handling tutorial te integreren Blanche?
Ik dacht eraan om eerst dit artikel aan te passen en wellicht dat ik dat stuk dan nog op kan nemen in de error handling handleiding.
 



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.