Vyvolání vlastní výjimky do logu

kolibla
Člen | 25
+
0
-

Ahoj, hezký večer,

potřebovala bych se dozvědět info kolem výjimek a předem se omlouvám, pokud otevírám téma, které je již vyřešené někde jinde.

V souboru bootstrap.php mám klasicky:

$configurator->enableTracy(__DIR__ . '/../log', 'email@email.com');

Když dojde k určité chybě 500 – aplikační chyba, tak přijde HTML Exception do logu + e-mail (to je OK). Jak bych si tohle mohla zajistit u bloku například try-catch? Pro příklad (budu psát hodně pseudokódem):

private function custom()
{
	if ($response->status !== 200)
	{
    	throw new \Exception("Bad response state: " . $response->status);
	}
}

A někde dál je volání:

try
{
	$this->custom();
}
catch (\Exception $e)
{
	Debugger::log($e->getMessage(), ILogger::EXCEPTION);
}

Jenže tady je kámen úrazu. Potřebovala bych pěkně vyhodit tu HTML Exception, která se posílá do logu (klasická červenka) + odeslat e-mail. Jenže nic takového se nestane a vytvoří se pouze soubor exception.txt – jméno souboru se nastaví podle levelu, co se zadá do druhého parametru funkce:

log($message, string $level = ILogger::INFO)

Do souboru exception.txt ta chybka skočí, to je pochopitelné… Jenže – tím to končí. Možná taky něco dělám špatně, proto se ptám vás, zkušených borců. Takže ještě jednou a naposledy to zkusím shrnout.

Existuje nějaký vlastní jednoduchý způsob, jak si posílat ty pěkné HTML Exceptions na výstup + zaslání e-mailu?

Děkuji předem za konstruktivní pomoc,

Kamila.

Editoval kolibla (17. 10. 2020 1:18)

Kori
Člen | 73
+
+2
-

Ahoj,

uprav si to na

try
{
	$this->custom();
}
catch (\Exception $e)
{
	Debugger::log($e, ILogger::EXCEPTION);
}

Btw, Pokud si to dobre z hlavy pamatuju, tak mail se posila od ILogger::ERROR vys, takze si tim muzes ridit, kdy to jen ulozit a kdy i poslat mail.

Editoval Kori (17. 10. 2020 2:03)

kolibla
Člen | 25
+
0
-

Kori napsal(a):

Ahoj,

uprav si to na

try
{
	$this->custom();
}
catch (\Exception $e)
{
	Debugger::log($e, ILogger::EXCEPTION);
}

Btw, Pokud si to dobre z hlavy pamatuju, tak mail se posila od ILogger::ERROR vys, takze si tim muzes ridit, kdy to jen ulozit a kdy i poslat mail.

Však to tak volám, přesně tak to mám v catchi, akorát to nefrčí tak, co požaduji.

Kori
Člen | 73
+
+3
-

V tvym kodu ukladas jen message, ne celou exception…

Debugger::log($e->getMessage(), ILogger::EXCEPTION);

Pripadne se podivej do tempu, jestli tam nemas soubor email-sent. Pokud jo, tak ho smaz a mel by ti hned prijit mail s dalsi vyjimkou. Je to kvuli tomu, aby ti nechodilo milion mailu najednou…

Editoval Kori (17. 10. 2020 2:54)

filsedla
Člen | 101
+
+1
-

Ahoj, catch block ti exception v podstatě „zničí“. Pokud chceš, aby se s ní dělo ještě něco dalšího, znovu ji vyhoď:

try
{
	$this->custom();
}
catch (\Exception $e)
{
	Debugger::log($e, ILogger::EXCEPTION);
	throw $e; // <---
}