Java efficace Utiliser les exceptions vérifiées pour les états récupérables et les exceptions d'exécution pour les erreurs de programmation

La propre interprétation efficace de Java. J'ai essayé d'interpréter l'article 70 de la 3e édition en écrivant mon propre code.

Grossièrement

«Récupérable» signifie que le thread en cours ne peut pas être arrêté même si une exception se produit et que l'état peut être renvoyé à un autre contrôle. Étant donné que l'implémenteur de la méthode sait qu'une exception peut se produire, il génère une exception vérifiée et force l'appelant de la méthode à la gérer. Une "erreur de programmation" est celle dans laquelle la méthode est utilisée d'une manière que l'implémenteur interdit et le thread en cours doit être arrêté. Imprimer une exception d'exécution (qui ne doit généralement pas être interceptée).

Exemples nécessitant des exceptions vérifiées

Considérez la méthode de couche de service suivante.

--Achetez un livre avec l'ID spécifié

** Cette méthode d'achat **


     /**
     *Acheter un livre avec l'ID spécifié
     *Ajoutez des livres achetés au tableau des livres achetés pour réduire le solde
     *Produire une exception si le solde est insuffisant
     *
     * @param bookId ID de livre à acheter
     * @param userId ID utilisateur
     * @jette InsufficientFundsException Exception de déséquilibre
     */
    public void buyBook(String bookId, int userId) throws InsufficientFundsException {

        //Obtenez le prix du livre à acheter
        Book selectedBook = bookDao.selectByBookId(bookId);
        int bookPrice = selectedBook.getPrice();

        //Obtenez l'équilibre
        BankAccount myBankAccount = bankAccountDao.selectByUserId(userId);
        int myBalance = myBankAccount.getBalance();

        //Produire une exception lorsque le solde est insuffisant
        if (bookPrice > myBalance) {
            int shortage = bookPrice - myBalance;
            throw new InsufficientFundsException("Le solde est insuffisant.", shortage);
        }

        //Ajouter des livres achetés au tableau des livres achetés
        BoughtBook myBoughtBook = new BoughtBook();
        myBoughtBook.setUserId(userId);
        myBoughtBook.setBookId(bookId);
        boughtBookDao.insert(myBoughtBook);

        //Réduisez l'équilibre et mettez à jour
        int afterMyBalance = myBalance - bookPrice;
        myBankAccount.setBalance(afterMyBalance);
        bankAccountDao.update(myBankAccount);
    }

** Classe d'exception de solde insuffisante **


/**
 *Exception de solde insuffisant
 */
public class InsufficientFundsException extends Exception {

    private int shortage;

    /**
     *Message d'exception et manque à gagner
     *
     * @message param Message d'exception
     * @montant de pénurie de param
     */
    public InsufficientFundsException(String message, int shortage) {
        super(message);
        this.shortage = shortage;
    }

    public int getShortage() {
        return this.shortage;
    }
}

Raison de la sortie d'une exception vérifiée

Que vous puissiez acheter un livre ou non dépend du solde actuel de votre compte bancaire. En bref, il est possible qu'une situation exceptionnelle se produise dans laquelle un livre ne peut pas être acheté, donc une exception de vérification est générée pour forcer l'appelant à passer à un autre processus ou émettre un message d'erreur pour forcer la gestion. Si une exception non vérifiée est sortie, l'appelant peut ne pas savoir que la gestion doit être implémentée et le thread actuel peut s'arrêter sans entrer dans le processus de récupération.

Inclure des informations supplémentaires dans la manipulation

L'inclusion d'informations supplémentaires dans les exceptions que vous indiquez peut être utile du côté de la gestion. Par exemple, dans le code ci-dessus, en incluant les informations de solde insuffisantes dans l'exception, il est possible de spécifier dans quelle mesure le solde est insuffisant lorsque le côté de gestion veut envoyer un message d'erreur à l'utilisateur.

Exemples qui nécessitent une exception d'exécution

Considérez la méthode de couche de service suivante.

--Envoyer le montant spécifié à la personne spécifiée --Reportez-vous au tableau "Compte bancaire" du destinataire --Ajouter le solde du "Compte bancaire" du montant de transfert spécifié

** Méthode de transfert d'argent **

    /**
     *Envoyer le montant spécifié à la personne spécifiée
     *Spécifiez un nombre positif pour le montant du versement
     *
     * @transfert de paramètre Montant du transfert de prix
     * @param targetUserId ID du destinataire
     */
    public void transferMoney(int transferPrice, int targetUserId) {

        if (transferPrice <= 0) {
            throw new IllegalArgumentException("Le montant de la remise doit être spécifié sous la forme d'un nombre positif.");
        }

        BankAccount targetBankAccount = bankAccountDao.selectByUserId(targetUserId);
        int nowBalance = targetBankAccount.getBalance();
        int afterBalance = nowBalance + transferPrice;
        targetBankAccount.setBalance(afterBalance);
        bankAccountDao.update(targetBankAccount);
    }

Raisons d'imprimer une exception d'exécution

Cette méthode interdit la spécification de nombres non positifs. En effet, si un nombre négatif est spécifié, le solde de l'autre partie sera réduit. Étant donné que l'implémentation de l'appelant de méthode peut empêcher 100% des nombres non positifs, si un nombre non positif est spécifié, il est jugé comme un bogue de programme, une exception d'exécution est générée et le thread actuel est arrêté. En effet, si le traitement se poursuit, un traitement involontaire peut se produire, ce qui est dangereux.

(Supplément) Toutes les exceptions d'exécution ne doivent pas être interceptées

Toutes les exceptions d'exécution ne doivent pas être interceptées, les exceptions d'accès aux données Spring sont implémentées en tant qu'exceptions d'exécution et peuvent intercepter et renvoyer une autre exception vérifiée.

Recommended Posts

Java efficace Utiliser les exceptions vérifiées pour les états récupérables et les exceptions d'exécution pour les erreurs de programmation
Élément 70: utiliser les exceptions vérifiées pour les conditions récupérables et les exceptions d'exécution pour les erreurs de programmation
Programmation Java (variables et données)
Instructions Java while et for