Hierarchie výjimek, použití $e->getPrevious()
- radekBrno
- Člen | 61
Zdravím,
mám funkci, která obstarává stažení dat z jiného serveru přes cURL a tato funkce vyhazuje 3 výjimky. Chtěl jsem, aby funkce vyhazovala jen jednu výjimku a proto v catch bloku vyhodím výjimku CurlConnectionException s odkazem na předchůdce. Problém je ten, že v logu mám jen chybu způsobenou výjimkou CurlConnectionException (bez návaznosti na původní) a i když jsem ve vývojové verzi, tak se mi nezobrazí chybová hláška (vidím jen Tracy panel). Díky za radu.
public function curlConnection($url, $header = null)
{
try {
if (!function_exists('curl_init')) {
throw new CurlNotIncludedException('CURL library is not included in a file php.ini, contact your server administrator.');
}
if (($ch = curl_init()) === false) {
throw new CurlInitException('Error occured in function curl_init(): ' . curl_error($ch));
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if (!is_null($header)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
if (($data = curl_exec($ch)) === false) {
throw new CurlExecException('Error occured in function curl_exec(): ' . curl_error($ch));
}
return $data;
} catch (CurlNotIncludedException | CurlInitException | CurlExecException $e) {
throw new CurlConnectionException('cURL connection error.', 0, $e->getPrevious());
} finally {
if (isset($ch)) {
curl_close($ch);
}
}
}
Použití funkce:
try {
...
$jsonData = self::curlConnection($task->url . '?id=' . $import, array(self::API_KEY_HEADER));
$data = Json::decode($jsonData);
...
} catch (CurlConnectionException | JsonException $e) {
Debugger::log($e);
}
Definice výjimky:
declare(strict_types=1);
namespace Exception;
class CurlConnectionException extends \Exception
{
}
- David Matějka
- Moderator | 6445
- jako
previous
parametr musíš dát$e
, nikoliv$e->getPrevious()
. takhle tam předáváš previous té výjimky, kterou si chytil – a ta je asi null - že se tracy nezobrazí v debug módu je správně, když tam tu výjimku chytáš a loguješ
- btw, defaultní level Debugger::log je info, takže se ti například nepošle mail z tracy