Advertisement
  1. Code
  2. Laravel 5

Que sont les Exceptions de Laravel?

Scroll to top
Read Time: 5 min

() translation by (you can also view the original English article)

En tant que développeur PHP, vous utilisez peut-être les exceptions, car elles vous permettent de remarquer lorsque quelque chose se passe mal ou que l'utilisateur a fait une erreur de manipulation (comme une division par zéro). Sans les exceptions, votre application finirait par afficher des erreurs indésirables et serait bien plus difficile à débugger. Il est aussi important que vous arretiez l'exécution immédiatement et qu'une autre action prenne le relais.

Les exceptions sont vraiment simples et permettent une évolution plus facile du développement. Une fois maitrisé l'utilisation des exceptions, elles feront parties intégrantes de vos développements.

Qu'est-ce qu'une Exception?

Je pense que la meilleure définition des exceptions est donnée par Martin Fowler:

Les exceptions signalent quelque chose qui se passe en dehors des limites du comportement attendu du code en question.

Pour être précis, une exception est un événement, qui se produit pendant l'exécution d'un programme, qui perturbe le déroulement normal des instructions du programme. Quand vous lancez une exception - throw (créer un objet d'exception et rendre la main au système) - le système va la capturer - catch - en recherchant le handler approprié et retourner le bon message.

1
try { 
2
    // the code goes here 
3
} catch (Exception $e) { 
4
    // if an exception happened in the try block above 
5
6
}

Quand devons-nous utiliser les exceptions?

Utilisez les exceptions lorsque votre système se trouve face à des circonstances exceptionnelles qu'il ne peut pas gérer. On n'utilise les exceptions seulement lorsque le système ne peut pas déterminer ce qui c'est passé. Martin Fowler croit que "si l'erreur est un comportement possible, alors il ne faut pas utiliser les exceptions". Cela veut dire que vous devez utiliser les exceptions lorsque vous n'êtes pas en mesure de déterminer l'erreur. Les exceptions ne devraient être utilisées que dans des circonstances exceptionnelles.

Note: les exceptions ne sont pas bonnes pour gérer une logique dans le code.

Pour une opération comme la validation de données entrantes, utiliser les exceptions est mal. Premièrement, le texte entrant doit être déterminer, et une application comme celle là doit retourner une collection d'erreurs et non pas une seule erreur. Je crois qu'il faut éliminer l'utilisation des exceptions dans toutes les circonstances où l'on peut rencontrer des erreurs de validation.

Capturer une exception est très important, sans quoi le système va retourner une erreur. L'opération de capture doit être la plus proche possible du point qui pourrait déclencher l'exception.

Que sont les exceptions de Laravel?

Laravel utilise des Handler d'exception, qui est une classe dans App\Exceptions\Handler.php. Cette classe contient deux méthodes principales (la méthode renderHttpException qui est utilisée pour toutes les exceptions HTTP, comme les 404 et 503, est dans la classe parent du Handler). La première est report, qui est utilisée pour logger les exceptions ou les envoyer vers un service externe. Voici un exemple de la méthode report:

1
2
public function report(Exception $e)
3
{
4
    if ($e instanceof CustomException) {
5
        //
6
    }
7
8
    return parent::report($e);
9
}

La seconde est render. La méthode render est responsable de la convertion d'une exception en réponse HTTP qui doit être retournée au navigateur. Voici un exemple de méthode render:

1
public function render($request, Exception $e)
2
{
3
    if ($e instanceof CustomException) {
4
        return response()->view('errors.custom', [], 500);
5
    }
6
7
    return parent::render($request, $e);
8
}

Note: vous pouvez utilser la propriété $dontReport du handler d'une exception pour ignorer des exceptions par type.

Vous pouvez changer les méthodes des exceptions Laravel par les vôtre de cette façon:

1
public function render($request, Exception $e)
2
{
3
    if (config('app.debug')) {
4
        return parent::render($request, $e);
5
    }
6
    return $this->handle($request, $e);
7
}

Ceci n'appellera la méthode render que si la configuration de debug est à true.

Comment créer vos propres exceptions Laravel?

Vous pourriez avoir besoin de créer vos propre classe d'exceptions. Vous devez étendre la classe de base des exceptions Laravel - J'ai créé une classe abstraite qui servira de base à nos classes d'exceptions. Créez un fichier dans App\Exceptions\monException.php:

1
namespace App\Exceptions;
2
use Exception;
3
abstract class monException extends Exception
4
{
5
    protected $id;
6
    protected $details;
7
    
8
    public function __construct($message)
9
    {
10
        parent::__construct($message);
11
    }
12
13
    protected function create(array $args)
14
    {
15
        $this->id = array_shift($args);
16
        $error = $this->errors($this->id);
17
        $this->details = vsprintf($error['context'], $args);
18
        return $this->details;
19
    }
20
21
    private function errors($id)
22
    {
23
        $data= [
24
            'not_found' => [
25
                'context'  => 'The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.',
26
            ]
27
            //   ...
28
        ];
29
        return $data[$id];
30
    }
31
}

Et la classe d'exception:

1
namespace App\Exceptions;
2
class NotFoundmonException extends  monException
3
{
4
    public function __construct()
5
    {
6
        $message = $this->create(func_get_args());
7
        parent::__construct($message);
8
    }
9
}

Vous pouvez utiliser la classe ci-dessus dans votre code:

1
    try {
2
        throw new \App\Exceptions\NotFoundmonException('not_found');
3
    }
4
    catch(\App\Exceptions\NotFoundmonException $e)
5
    {
6
        return $e->getMessage();
7
    }

En parallèle de la classe d'exception du coeur de Laravel, vous pouvez utiliser le module Assertion. Il peut être utilisé comme une classe d'exception, vous pouvez l'utiliser pour éviter les blocs if spaghetti dans votre code.

Pour installer le module Assertion, vous devez taper la commande suivante:

1
composer require beberlei/assert

Par exemple, si vous souhaitez vérifier l'adresse email d'un utilisateur, vous pouvez faire ceci:

1
use Assert\Assertion;
2
use Assert\AssertionFailedException;
3
//...
4
try {
5
    Assertion::email($value, "The value must be valid E-mail address");
6
} catch(AssertionFailedException $e) {
7
    $e->getValue(); // the value that caused the failure
8
    $e->getConstraints(); // the additional constraints of the assertion.
9
}

Conclusion

Indépendemment du language que vous choisissez d'utiliser, les exceptions sont très importantes à comprendre car elles nous aident à garder le contrôle sur le déroulement de l'exécution d'une application.

De plus, elles nous aident à logger les problèmes lorsqu'ils arrivent et rendent l'application plus robuste.

Comme vous pouvez le voir dans le travail de ce tutoriel, Laravel est un framework qui offre d'excellentes fonctionnalitées de capture des exceptions pour le développement d'applications web.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.