Nette a vlastní zachytávání chyb

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
sKopheK
Člen | 207
+
0
-

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)

Milo
Nette Core | 1283
+
0
-

A co je obsahem Fatal erroru?

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

sKopheK
Člen | 207
+
0
-

Nikdo ten projekt nezkoušel?