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

9
SexyMF 20 avril 2017 à 11:20

3 réponses

Meilleure réponse

Attraper Throwable a fait l'affaire.
Vous ne savez pas pourquoi? Quelqu'un le fait?

16
u890106 1 sept. 2017 à 15:41

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
}
4
Eugene van der Merwe 3 août 2019 à 06:46

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.

1
Cliff Edge 22 sept. 2017 à 19:33