Autor | Zpráva | ||
---|---|---|---|
zasphp Profil * |
#1 · Zasláno: 24. 7. 2010, 23:31:20
Ahoj. Delší dobu řeším docela složitý problém a už jsem v koncích. Aplikace je rozsáhlá, tak raději napíšu princip: Mám třídu Logger které předám objekt textfile, který provádí zápis do textového souboru. Potom různě v aplikaci volám Logger::logInfo($text) a takto do toho souboru loguji. Obrovský problém ale nastává, pokud potřebuju logovat v destruktoru nějakého objektu, protože se jako první zavolá destruktor objektu textfile, takže Logger nemá kam logovat - to jsem chtěl vyřešit výjimkami v třídě TextFile (tvořící objekt textfile). Jenže, pokud už se PHP dostane do bodu, kdy začne volat destruktory, tak přestává zachycování výjimek dost dobře fungovat a dostanu všeříkající hlášku "Fatal error: Exception thrown without a stack frame in Unknown on line 0". Netušíte někdo co s tím?
|
||
Majkl578 Profil |
#2 · Zasláno: 24. 7. 2010, 23:46:59
Bug s výjimkami vyhozenými v destruktoru objektu byl opraven ve verzi 5.3.0.
|
||
zasphp Profil * |
#3 · Zasláno: 24. 7. 2010, 23:52:24
Zřejmě ne:
echo phpversion(); 5.3.2-1ubuntu4.2 |
||
zasphp Profil * |
#4 · Zasláno: 24. 7. 2010, 23:55:48
Třeba tato konstrukce v době volání destruktorů nefunguje moc dobře:
if (is_null($this->filehandler)) throw new \UnreachableStorageException('Text nejake vyjimky, ktery se ale nezobrazi v destruktoru'); |
||
Majkl578 Profil |
#5 · Zasláno: 25. 7. 2010, 01:35:57
Můžeš uvést přímo kontext ve kterém to používáš?
|
||
Nox Profil |
#6 · Zasláno: 25. 7. 2010, 08:42:33 · Upravil/a: Nox
Není to spíš feature než bug?
Manuál: "Note: Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error." |
||
zasphp Profil * |
#7 · Zasláno: 25. 7. 2010, 12:53:18
Ono zachytávat tu mou výjimku lze, ale pokud jí nechám být tak se mi vypíše jen to nic neříkající hlášení.
|
||
Nox Profil |
#8 · Zasláno: 25. 7. 2010, 13:49:53 · Upravil/a: Nox
to hlášení znamená že byla hozená výjimka mimo běžný tok programu (nebo tak něco)
try{ /* obsah destructoru */ }catch(Exception $e){ /* nějaké zpracování chyby */ } |
||
Časová prodleva: 14 let
|
0