Diskuze: Ošetření chyb v PHP
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Záleží co myslíš tou chybou?
Možná:
for($i=0;$i<32;$i++)
{
funkce1();
try{
funkce1();//tady vznikne chyba, někde v půlce cyklu třeba.
}catch(\Exception $exception){
// V tento okamžik nastala nějaká chyba
// Můžeš něco vykonat nebo taky nic a program bude pokračovat na volání další funkce
}
funkce1();
}
Spíš jsem dej konkrétní kód, než tenhle pseudo - pokud ti nejde pouze o terorii.
Zalezi na tom, jak to chces mit resene.
7 - ohcc at 163 dot com) a nebo jeste neco uvnitr (Example #3).
http://php.net/manual/en/language.exceptions.php
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>
V tomto examplu, kdyz nastane chyba, tak vyhodi exception, ten if. A nasledne ti to exception zachyti dalsi try To if tam ale nemusi byt. Jenze, pak ti vyhodi error return 1/$x; To bys pak musel dat do try.
for (...)
try {
$x = 1/$i;
} catch (Exception $e) {
break; // kdyz nastane chyba, ukonci cyklus
}
---
Hele, ale ify bys prave resit mel. Vsechny situace bys mel predvidat. V opacnem pripade bych takovy program nechtel zaplatit, smazal a poslal te jinam.
function exceptions_error_handler($severity, $message, $filename, $lineno) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
set_error_handler('exceptions_error_handler');
?>
@$x = 1/$i;
// @session_start();
// @include 'file.php';
function exceptions_error_handler($severity, $message, $filename, $lineno) {
// throw new ErrorException($message, 0, $severity, $filename, $lineno);
$msg = "$message, 0, $severity, $filename, $lineno";
$headers = '...';
mail('adresa', 'chyba ze stranky', $msg, $headers)
}
set_error_handler('exceptions_error_handler');
?>
Nekoukej, konkrétního kodu je hromada, proto ten pseudokod pro pochopeni. A
jde mi hlavně o fatal errory a to jsem psal V tvem příkladu, to jsem právě
zkoušel co píšeš, při fatal erroru to nefunguje script končí. Nedonutím
ho pokračovat.
Peter Milch Zavináče používám na jednom možná dvou míctech, jedno je
autoloader druhé už nevím
Ten příklad s error handlerem nebo podobný na ten jsem narazil a je fakt ze
takto:
function shutdown_error() {
$error = error_get_last();
if ($error['type'] & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_PARSE))
{
echo("Nastala chyba");
}
}
register_shutdown_function('shutdown_error');
to umi fatal error detekovat. Ale nedaří se mi ho přesvědčit aby v cyklu pokračoval. Jinak ao ifuju kde můžu, ale je toho moc a občas se stane že fakt něco nepředvídáš a měl jsem právě za to, že na to jsou vyjímky. V takovým C# to tuším tak funguje. Co si pamatuju. Nebo to tam je prošpikovaný odpalováním vyjímek už v v základu dotnetu nevim. Jen vím že tam mi to pomáhalo, tady si to ošetřit spíš přidělá práci.. Nevidím proto moc velký rozdíl mezi ifama a vyjímkama.
Jediné co mě napadá je ukládat si číslo pruchodu cyklem nekam do souboru nebo db. Pokud detekuju fatalerror tak script naikludovat znovu s tím že se podívá kde skočil a nastaví začátek na další cyklus. Ale nevím aby to nebyla cesta někam do prdele.
Zmínku o fatal jsem nějak přehlédl, tak tím pádem místo \Exception odchytni \Error nebo můžeš \Throwable - to by mělo odchytit jak errory tak všechny výjimky. -> za předpokladu, že používáš PHP 7. (Akorát to nemám odzkoušené, tak to můžeš vyzkoušet a uvidíš)
'je toho moc a občas se stane že fakt něco nepředvídáš'
To se mi opravdu nestava. Obvykle predvidam vsechno.
Problem je, ze mozna neumis spravne osetrit vstupni hodnoty.
V prikladech na netu se na osetrovani vstupu nehledi, protoze je to kod navic, ktery priklad zneprehlednuje. Podobne ve skole. V praxi to proste jinak nejde. Dobry program nesmi uzivateli zhavarovat. Jinak je to jen laciny sunt, jakych je 99.9% programu. Za maly peniz, rychle udelany, nejakym studentikem. Pak neni problem to hacknout 10 letym skolakem podle navodu na netu.
Ale nektere stavy neosetruji. Ty vsak nezpusobi pad programu, jenom dovoli ulozit nesmysly nebo pisou nesmysly o chybe, ikdyz uzivatel nevyplnil zatim policko.
Vstupy mam ošetřené dobře snad. Samotný program co klienti používají mi nepadá. To je naprosto v cajku. Ale některé krony zpracovávající data co běží třeba 18x děnně a data načítají z jiných zdrojů, které se mohou měnit a občas do toho zdroje je zanesena chyba, tam mi to občas kolabuje a to se snažím ošetřit. A věř mi že tam fakt nevyčucháš všechno co se ti může stát. Pokaždé mě nějaký zdroj něčím překvapí co do toho zanesou z nenadání.
Možná hloupý dotaz. Ale nebylo by smysluplnější tomu předcházet validací zdroje, než řešit někde v průběhu následky vyskytující se nahodile?
Tomáši ,také pravda. Ale nevím jak přesně aby to to bylo na tuti. Zdrojů je momentálně 80 cca a nejsou pravidla jak má vypadat. Samozřejmě jisté věci jako existenci dat,proměnných, položek a kontrolu kde čeho už jsem nasadil, ale stále to nemusí stačit.
hmmm, jak tedy zpracováváš zdroj, když pro něj neexistují
strukturální a typová pravidla? k čemu ti tedy tyto zdroje jsou, když
přesně nevíš jaká data z nich získáš? asi nějak nerozumím jak to
funguje...
z mého pohledu v obecné rovině je jedno odkud data jsou... stejně bys je
měl validovat jako se tomu děje např. u formulářů
buď tedy podle primitivních datových typů daného jazyka, nebo pak podle
uživatelsky definovaných datových typů - tam se dá využít např.
regulárních výrazů
za mne se jako rozumnější jeví pokud počáteční validace selže - a vyhnu
se tak fatal erroru někde v průběhu..
reálným příkladem buď např. import bankovních výpisů do účetnictví -
ikdyž takovéto zdroje bývají vcelku dobře dokumentované k aktualizaci
struktury i tak může dojít...
Zobrazeno 13 zpráv z 13.