Nette a vlastní zachytávání chyb

- sKopheK
- Člen | 207
Konkrétně se mi jedná o chyby vyhazované třídou
SoapClient. Když konstruktoru předám v parametru URL, která
neobsahuje platný soubor ve WSDL formátu, ukáže se v laděnce Fatal Error.
Funkce set_error_handler() nebo
register_shutdown_function() nezabírají, nebo to píšu nějak
špatně.
Editoval sKopheK (3. 4. 2014 13:49)

- Filip Procházka
- Moderator | 4668
WSDL si můžeš stáhnout například do tempu a potom předat tomu soapu ten stáhnutý soubor. Tím si můžeš podchytit že wsdl neexistuje nebo je třeba nějak rozbité a tedy by ses měl vyhnout fatalu.

- sKopheK
- Člen | 207
Jedná se o aplikaci, která načte WSDL soubor právě přes
SoapClient a z něj už snáze získá všechny dostupné funkce
i s parametery a návratovými hodnotami. Ty se pak uloží do databáze a
poskytnou uživatelům služby ve formě manuálu doplněného o ručně
přidané poznámky a pro testovací volání, aby šlo ověřit, že to funguje
správně apod. V administraci je možné WSDL soubor importovat ze zadané
URL – sice je tam přednastavená, ale už jen z programátorské
zvědavosti bych to rád vyřešil. Obecně to asi není problém, ale v Nette,
které má navázané vlastní error_handlery apod. se mi to zatím
nedaří.

- Filip Procházka
- Moderator | 4668
Však kde je problém, pro tu sekci aplikace která ty errory zpracovává si takto navaž vlastní :)
Já se ti snažil poradit ať oddělíš to samotné načítání WSDL a jeho předání do soapClienta, aby ho nestahoval on, ale ty, například přes cURL, které ti nebude házet fatal errory, když se nepovede to WSDL načíst. Chápeš? Fatal errory se totiž dost blbě chytají, je lepší jim předcházet :)

- sKopheK
- Člen | 207
Já předanou URL napřed načtu, abych ověřil XML, a pak to předám tomu
SoapClientovi.
libxml_use_internal_errors(FALSE);
$xml = @simplexml_load_file($url);
$xml_errors = libxml_get_errors();
try {
$client = new \SoapClient($url,array(
'exceptions' => true,
));
} catch ( \SoapFault $e ) {
echo $e->getMessage();
}
V Nette se ale výjimka nezachytí a vyhodí se Fatal Error. Když to zkouším bez Nette, tak to zachytí v pořádku.
@Filip
Díky, ale bohužel kvůli Nette je to Fatal Error, který nelze přes error handler zachytit, a v shutdown function se z něho už zotavit nedá.
@Milo
Záleží, co tam za chybu je. Když tomu schválně předám třeba
RSS, tak
SOAP-ERROR: Parsing WSDL: Couldn't find <definitions>
ale to je irelevantní.
Editoval sKopheK (4. 4. 2014 11:44)

- Milo
- Nette Core | 1283
Tenhle fatal je bug v SOAP a co si pamatuji, byl fixnutý loni. Používám tento workaround:
try {
$c = @new SoapClient('http://bad-url', array('exceptions' => TRUE));
} catch (SoapFault $e) {
echo "Exception: {$e->getMessage()}\n";
}
echo "Continue\n";
Trochu potíž je v tom, že se ten fatal „napůl“ provede a skript na command line vrací 255.

- Filip Procházka
- Moderator | 4668
Díky, ale bohužel kvůli Nette je to Fatal Error, který nelze přes error handler zachytit, a v shutdown function se z něho už zotavit nedá.
Ale to přece není kvůli Nette, to je kvůli SOAPu.
A říkal jsem ti at předáš tomu SOAPu už načtený XML, proč mu zase předáváš url? proč ho neuložíš do nějaké složky a nepředáš mu lokální soubor?

- sKopheK
- Člen | 207
Díky za odpovědi.
@Milo
To jsem už také zkoušel.
@Filip
Pro klid duše a tvých nervů jsem soubor stáhl na disk a předal konstruktoru jeho umístění. Světe div se, žádná změna.
Abyste si nemysleli, že si tady vymýšlím, hodil jsem na https://github.com/…eK/soap-test
sandbox, kde zkouším to, o čem tu debatujeme. Pod www/ je verze
v Nette, www/non-nette.php je čisté PHP. Při prvním
spuštění (Nette), když se vytváří cache, se to chová správně, potom
už se objeví Laděnka. V souboru www/url.php jsou URL.
PHP 5.5.10 | Apache/2.4.7 (Win64) OpenSSL/1.0.1e PHP/5.5.10 | Nette Framework 2.1.1 ( on 2014–02–08)
Editoval sKopheK (8. 4. 2014 13:19)