Autor Zpráva
Tokan
Profil *
Zdravím všechny.

Snažím se vytvořit třídu, která by se mi starala o zachytávání chyb v PHP.

i přes toto nastavení:

error_reporting(0);
ini_set('display_startup_errors', 0);
ini_set('display_errors', 0);

je bohužel stále aktivní výpis chyby typu E_PARSE. Tato chyba patří mezi chyby fatální, stejně jako například E_ERROR, který se mi ovšem daří zachytit pomocí register_shutdown_function().

Je nějaký trik či nějaká metoda, jak chybu tohoto typu zachytit?

Nejmenovaná společnost mi sdělila, že tyto chyby zachytit nejdou, jelikož se po jejich vyskytnutí ihned ukončí vykonávání skriptu, což ale nemůže být pravda, jelikož E_ERROR patří také mezi tyto chyby a ten zachytit lze. Navíc například NETTE má zachytávání i těchto chyb a funguje bezproblému.

Jak to tedy udělat? Nějaký "preparser" daného souboru, či jak?

Děkuji za jakékoliv rady.


// Doplnění

Někde jsem se nyní dočetl, že fatální chyba se nesmí vyskytnout ve stejném souboru, kde je chyba ošetřována. Může být tohle můj problém?

Při vývoji totiž využívám jen jednoho souboru. Děkuji
Dusann
Profil
Tokan:
Nejmenovaná společnost mi sdělila, že tyto chyby zachytit nejdou, jelikož se po jejich vyskytnutí ihned ukončí vykonávání skriptu, což ale nemůže být pravda, jelikož E_ERROR patří také mezi tyto chyby a ten zachytit lze.



E_PARSE je compile-time chyba, takže je logické že ju nemôžeš ošetriť cez skript, ktorý sa vďaka tejto chybe nespustí. Sú to chyby v syntaxi skriptu.

E_ERROR je run-time chyba, takže ju v danom skripte kde sa vyskytla dokážeš ošetriť cez shutdown funkciu. Tieto chyby vznikajú počas behu aktuálneho skriptu.

Ak ti niekto na serveri nenechá zdroják s chybným syntaxom, tak sa ti E_PARSE samozrejme nikdy nevyskytne. Ak máš display_errors vypnuté tak sa nezobrazí ani hláška z tejto chyby. Do PHP logu sa táto chyba zapisuje (ak log do súboru nemáš zakázaný).

Takže neviem, či má zmysel riešiť handlovanie tejto chyby. Ale rád sa o tomto tiež dozviem nejaké užitočné info :)
juriad
Profil
Tokan:
Soubor, který nelze zkompilovat by se na server vůbec neměl dostat. Pro test (před uploadem) můžeš spustit všechny php soubory příkazem php -l, který je zkusí rozparsovat. To by ti mělo zabránit výskytu chyb E_PARSE, za předpokladu, že na serveru je identická verze PHP.
Joker
Profil
Tokan:
Nejmenovaná společnost mi sdělila, že tyto chyby zachytit nejdou, jelikož se po jejich vyskytnutí ihned ukončí vykonávání skriptu, což ale nemůže být pravda
Ve skutečnosti to je trochu jinak.
E_PARSE znamená, že to vůbec není platný PHP kód.
Ne že se vykonávání skriptu ihned ukončí, vykonávání skriptu ani nezačne, protože není co vykonávat, daný soubor nelze zpracovat jako PHP.

Z toho je i zřejmé, že v takovém „ne-PHP“ tu chybu nelze odchytit.
Tokan
Profil *
Dobře, ještě se tedy zeptám:

Nevíte, co může způsobovat to, že se mi E_PARSE chyba objeví jako klasicky: Parse error: syntax error, unexpected ';' in ******* on line xxx

Samozřejmě na tom nic není, jen jde o to, že mám display_errors vypnuté. Nezobrazuje se žádná jiná chyba, než E_PARSE a pro absolutní jistotu bych měl rád možnost, ani tuto chybu nevypsat v případě potřeby.

Děkuji.
Jan Tvrdík
Profil
Tokan:
Navíc například NETTE má zachytávání i těchto chyb a funguje bezproblému.
Proč tedy vlastně nepoužiješ hotovou Tracy a řešíš si to sám?

jen jde o to, že mám display_errors vypnuté
Nevypínáš je náhodou pomocí ini_set v tom souboru, který nelze kvůli parse chybě zpracovat? Co takhle to nastavit přes .htaccess?
Tokan
Profil *
Nepoužívám nette a mám to přizpůsobené pro své účely, z toho důvodu nepoužívám celou Tracy.

Tohle jsem si vůbec neuvědomil, pravděpodobně to tedy můj problém. Děkuji mnohokrát.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: