Jump to content
php.lv forumi

Error handling pardomas...


Joyride

Recommended Posts

Izmantoju pasa rakstitu vienkarsu klasi, kura ir wrapotas mysql funkcijas, piem., $DB->Query($sql) veic pieprasijumu, saglaba mainigaja atgriezto ierakstu skaitu un izveido datu masivu, lai uzreiz varetu operet ar datiem...

Jautajums ir - ka butu pareizak Query() funkciju veidot. Paslaik ir ta, ka ja mysql_query() atgriez false (kluda vaicajuma), tad ir die('DB ERROR'). Pec idejas, labak jau ir atgriezt vertibu, ko atgriez mysql_query(), nevis likt skriptam mirt. Savukart, saja gadijuma naktos VISUR parbaudit, ko tas kverijs atgriezis un ja atgriez false, tad VISUR paredzet attiecigu darbibu. Ja, piemeram, pieprasam menu items, bet kverijs atgriez false, vai tad ir jega skriptam vispar talak izpildities?

Kadas ir jusu domas?

 

EDIT: Ja kads nesaprata, tad mysql_query() tiek izsaukta ieks klases $DB->Query() funkcijas :)

Edited by Joyride
Link to comment
Share on other sites

kļūdas gadījumā izsauc kautkādu kļūdas funkciju, kurā izvadi smuku kļūdas paziņojuma lapu, lai iekļaujas lapas kopējā stilā (tipa: Atvainojiet notikusi kautkāda kļūda. Pienāciet vēlāk!).

Link to comment
Share on other sites

throw new MyDatabaseException('cauri i, šitais kverijs neizpildās');

 

un, ja gribi, MyDatabaseException() konstruktorā ar sataisi savu smuko datubāzes kļūdu parādīšanu/logošanu.

Edited by v3rb0
Link to comment
Share on other sites

Savukart, saja gadijuma naktos VISUR parbaudit, ko tas kverijs atgriezis un ja atgriez false, tad VISUR paredzet attiecigu darbibu.

 

Imho tas jādara jau vienmēr bez iebildumiem. Ir slikts stils rakstīt līku kodu, kurā nav pārbaudes uz resursiem.

Link to comment
Share on other sites

Visu cieņu, taču atļaušos nepiekrist Delfinam. Exception handling jau tieši tāpēc tika radīts, lai kļūdas nevajadzētu pārbaudīt VISUR. Ar exceptioniem kļūdas var pārbaudīt tajās, vietās, kur nepieciešams, lieki nepiedrazojot kodu ar nevajadzīgiem "if($kluda) ... else".

Link to comment
Share on other sites

Nu viņam ir viena funkcija, kas izsauc SQL ("$DB->Query($sql)"). Tur arī jāpārbauda/jāmet exception, kas sanāk tikai VIENĀ vietā. Es sapratu, ka viņa uztraukums un Delfina atbilde ir par to, ka kaut ko vajag pārbaudīt VISĀS vietās.

Link to comment
Share on other sites

1x ierakstīts.

if(mysql_query() == false) throw ..

 

cik sapratu, tad black teica ka variants

$res = $db -> query();
if($res == 'kluda') {
// ai,ai nedaram neko, kuda
} else {
//daram kaut ko taalaak
 $res2 = $db -> query();
 if($res2 == 'kluda') {
// vai, vai, nu pavisam nav labi, te ar kluda
 } else {
  // viss oki doki
 }
}

ir nesmuki, un mans ar ar tāpat domāt.

Link to comment
Share on other sites

Bet vai tas ir pareizi !? Ka pie exception izlido viss ārā.. tas ir tas pats DIE.

KĀ tu zini kurā brīdī throw-ot !?

 

Jūsu f-ju tad ir jāpartaisa par:

public bool DB::query($throw = false)

 

bet vienalga, ir vai nu katru reizi jāraksta try/catch vai IF bloks.

Tā kā SQL attiecās pie non-fatal (vairākos gadījumos), tad try/catch ir pārslogojums.

Link to comment
Share on other sites

Exception aaraa laist nekad nevajag. Vajag vismaz vienu try/catch bloku ap kodu, kursh var taisīt exceptionus, un catch blokā smuki izdrukājam normālu error message (pārslēdzam templeites uz error templeiteem, utt., utjpr.), kas ir krietni labaak par die("error");

Link to comment
Share on other sites

Imho tas jādara jau vienmēr bez iebildumiem. Ir slikts stils rakstīt līku kodu, kurā nav pārbaudes uz resursiem.

 

Bet tapec jau ir die(), skripts mirst un vairs nekas nav japarbauda. Tik drakoniski tapec, ka nav jegas talak neko darit, piemeram., neizdodas atlasit lietotaja sesiju no db. Prieks kam tur taisit 101 parbaudi un paradit - "atvainojiet, jus nevarat ielogoties, lidz ar to iepirkties, jo nobrukusi db / vaicajums sacakarets ar cross-site scripting, pagaidiet, kamer likrocigais admins savedis kartiba lapu" :)

Pasakiet, kadel puleties ar parbaudem? Manuprat, vertiba true/false jaatgriez ir cita veida funkcijas - validacija, logging utml, bet ne tik svariga vieta ka SQL. Bez DB lapa neiet, tatad fatal error, manuprat.

Link to comment
Share on other sites

Fatal, vai ne-fatal, kļūdu vajag smuki parādīt lietotājam, nevis pateikt, ka viss nokrašojis.

Kā tu justos, ja savā bankas kontā operētu ar naudas pārskaitījumu un uzspiežot kautkādu submit pogu, pretī saņemtu tukšu baltu lapu ar vienu vienīgu tekstu "error"?

Man jau labāk patiktos kas šāds - tas nekas, ka tā ir 404 lapa, arī sql errora gadījumā gribētu saņemt sakarīgu aprakstu, ka kautkas neiet:

http://www.bbc.co.uk/asdasd

http://www.microsoft.com/blah

http://sourceforge.net/zazazaa

Link to comment
Share on other sites

Joyride, uzskati exceptiona izmešanu par gudrāku die(), kas nebeidzas tajā vietā kur izsauci, bet atļauj tālāk apstrādāt kļūdu - sataisīt smukās kļudu lapas priekš bubu, pielogot ka kāds spēlējies ar aplamu id padošanu utt.

Link to comment
Share on other sites

Tik drakoniski tapec, ka nav jegas talak neko darit, piemeram., neizdodas atlasit lietotaja sesiju no db.

 

tieši tā.. ne viss ir tik viennozīmīgs, bet die vispār kā tāds pats galējs variants, ja neko citu nevar izdomāt. Dēļ viena sql nevajag krešot visu webu... jo iesp. tai pašā laikā 98% pārēja weba strādā korekti. Piemērs iz dzīves - vienubrīd hansabankā pārskati nestrādāja uz predefinētiem periodiem (tip tekošais,iepriekšējais mēnesis un t.t.), bet varēja norādīt pats savu periods - jā links viņiem bija atstāts, bet viņi laipni "pasūtīja mani" tālāk, un tai pašā laikā pārējais viss strādāja labi (respektīvi bija pieejami visi pārējie linki).

 

Tādejādi, ja seko pricipam catch-ot visu, tad vai nu jātaisa globāls try/catch, vai nu katrā vietā tas bloks jāliek, kas nemaz nav izcilāks par IF-u, bet tā kā xxx_query nav fatāls iznākums, tad arī jēga pašam throw-ot nav. Turklāt apstrādāt ar IF daudz vienkāršāk, nekā izejot no try jāpieglabā šis tas temp mainīgajos, lai zināt vai "viss ķedā" ... te jau sākās tas marazms.

 

Kopumā es to redzu visu kā

 

DB::query($throw = false)
{
 $res = null;
 try
 {
$res = xxx_query(...)
if ($throw && !$res)
   throw Exception;
 }
 catch (...)
 {
// ja nu paspruukst kaut kas, modulis nav ieladets vai vel kkas
...
return false;
 }
 return $res;
}

 

PS: līdzīgi kā ar include PHP ir jāatstāj izvēlēs brīvība - include, include_once, require, require_once (kur visi virtuāli reducējās uz f-ju include_file($require = false, $once = false) )

Edited by Delfins
Link to comment
Share on other sites

×
×
  • Create New...