Hierarchie výjimek, použití $e->getPrevious()

radekBrno
Člen | 61
+
0
-

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
+
+2
-
  1. 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
  2. že se tracy nezobrazí v debug módu je správně, když tam tu výjimku chytáš a loguješ
  3. btw, defaultní level Debugger::log je info, takže se ti například nepošle mail z tracy