J'ai la situation suivante:
try {
DB::beginTransaction();
$task = new Task();
$task->setTracker("");
//thrown \Symfony\Component\Debug\Exception\FatalThrowableError
DB::commit();
}catch (\Exception $e){
DB::rollBack();
Log::error($e);
//throw $e;
}
Je n'entre pas dans la zone de capture.
Une idée pourquoi?
mettre à jour
Voici l'erreur lancée:
[Symfony\Component\Debug\Exception\FatalThrowableError]
Type error: Argument 1 passed to App\Models\Task::setTracker() must be an instance of Carbon\Carbon, integer given, called in /var/www/app/Services/ShareLogic.php on line 60
Et ne sera pas attrapé
Merci
3 réponses
Attraper Throwable
a fait l'affaire.
Vous ne savez pas pourquoi? Quelqu'un le fait?
Il n'attrape pas l'exception car vous essayez d'attraper \Exception
qui Symfony\Component\Debug\Exception\FatalThrowableError
ne s'étend pas.
Essayez plutôt d'attraper l'exception réelle en l'important.
use Symfony\Component\Debug\Exception\FatalThrowableError;
Et puis vous pouvez le faire.
try {
//
} catch(FatalThrowableError e) {
//
}
Éditer
Ok, donc en plus de la solution ci-dessus, il semble que PHP 7+ gère l'erreur un peu différemment de PHP 5. Alors essayez ceci.
try {
//
} catch(Error $e) {
// This should work
} catch(Throwable $e) {
// This should work as well
}
Le composant Debug de Symfony est beaucoup plus sophistiqué pour enregistrer et signaler toutes sortes d'erreurs, mais regardez cet exemple simple (php 7.1.x):
<?php
class MyUncatchableError extends Exception {}
function myExceptionHandler($e) {
throw new MyUncatchableError('BANG: '.$e->getMessage());
}
set_exception_handler('myExceptionHandler');
$foo = true;
try {
$foo->modify();
} catch (Exception $e) {
echo 'nope';
} catch (MyUncatchableError $e) {
echo 'nope2';
}
Quel sera le résultat? Bien:
Erreur fatale: Uncaught MyUncatchableError: BANG: Appel à une fonction membre modify () sur booléen dans / in / WJErU: 6
Trace de la pile:
- 0 [fonction interne]: myExceptionHandler (Object (Erreur))
1 {main}
jeté dans / in / WJErU sur la ligne 6
Et vous ne pouvez pas attraper cette exception car vous devriez attraper l'original .. jetable ici, qui est Erreur pour ce type "d'erreur". Vous pouvez l'attraper en attrapant la classe "Error". Et avec la hiérarchie PHP7, il implémente l'interface Throwable, c'est pourquoi vous ne pouvez pas l'attraper en utilisant Exception (car si Exception implémente Throwable, Error n'est pas une exception - voir: http://php.net/manual/en/language.errors.php7.php).
Et cela est vrai pour PHP7 + car avec 5. * il n'y avait ni Throwable ni Error, et faire $foo->modify();
arrêterait simplement le script et retournerait une Fatal Error. Vous pouvez créer votre propre gestionnaire d'erreurs (set_error_handler
) et y lancer une exception (et le composant Debug fait cela pour php 5. *) mais cette méthode ne fonctionne pas pour les erreurs fatales. Au lieu de cela, le composant de débogage se raccorde à lance FatalErrorException.
Cette description n'est peut-être pas tout à fait exacte car je n'ai pas approfondi Symfony, mais vous pouvez avoir l'idée ici.
Questions connexes
De nouvelles questions
php
PHP est un langage de script largement utilisé, de haut niveau, dynamique, orienté objet et interprété, principalement conçu pour le développement Web côté serveur. Utilisé pour les questions sur le langage PHP.