IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Gestion et traitement d'erreur


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Par défaut Gestion et traitement d'erreur
    salut


    j'utilise spring et je dois faire un traitement qui dépend d'un service externe.

    Mon controleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @RequestMapping(value = "/members/{memberId}/creditcard", method = RequestMethod.POST)
    public void saveCreditCard(@PathVariable("memberId") Long memberId, @RequestBody CreditCardInfoDto creditCardInfo){
        paymentService.saveCreditCard(creditCardInfo);
    }

    Mon service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
        @Transactional
        @Override
        public void saveCreditCard(CreditCardInfoDto creditCardInfo) {
     
            Member member = null;
     
            if (creditCardInfo.getMemberId() != null) {
                member = memberRepository.findOne(creditCardInfo.getMemberId());
            }
     
            List<PaymentGatewayConfig> paymentGateways = paymentGatewayConfigRepository.findAll();
     
            if (paymentGateways != null && !paymentGateways.isEmpty()) {
     
                PaymentGatewayConfig paymentGateway = paymentGateways.get(0);
                String paymentGatewayKey = null;
     
                if (member != null) {
                    paymentGatewayKey = member.getPaymentGatewayKey();
                }
     
                ResolveData resdata = null;
                ResolverReceipt resreceipt = null;
     
                if (paymentGatewayKey == null) {
     
                    ResAddCC resAddCC = new ResAddCC(creditCardInfo.getCreditCard(), creditCardInfo.getDateExpiration(), "7");
     
                    ResolverHttpsPostRequest mpgReq = new ResolverHttpsPostRequest(paymentGateway.getHost(), paymentGateway.getStoreId(), paymentGateway.getApiToken(), resAddCC);
                    resreceipt = mpgReq.getResolverReceipt();
                    resdata = resreceipt.getResolveData();
     
                    member.setPaymentGatewayKey(resreceipt.getDataKey());
                } else {
     
                    ResUpdateCC resUpdateCC = new ResUpdateCC(member.getPaymentGatewayKey());
                    resUpdateCC.setPan(creditCardInfo.getCreditCard());
                    resUpdateCC.setExpdate(creditCardInfo.getDateExpiration());
     
                    ResolverHttpsPostRequest mpgReq = new ResolverHttpsPostRequest(paymentGateway.getHost(), paymentGateway.getStoreId(), paymentGateway.getApiToken(), resUpdateCC);
     
                    resreceipt = mpgReq.getResolverReceipt();
                    resdata = resreceipt.getResolveData();
                }
     
                if (resdata != null) {
     
                    //success
                    if(Boolean.valueOf(resreceipt.getComplete()) &&  !Boolean.valueOf(resreceipt.getTimedOut())){
                        member.setPaymentGatewayKey(resreceipt.getDataKey());
                        memberRepository.save(member);
                    }else{
                        //payment refused
                       log.error("saveCreditCard: " +  member.getMemberId() +  " payment refused error code: " + resreceipt.getResponseCode());
                    }
     
                    Operation operation = createOperation(resreceipt);
                    operationRepository.save(operation);
                }
            }
        }

    Je me pose de nombreuse question.

    Il peut avoir des erreurs de sauvegarde de donnée (voir les repository save), le payment peut être refusé (j'ai mis un log actuellement), un erreur de connexion à ResolverHttpsPostReques et peut-être d'autre type d'erreur.
    Je me demande comment retourner cela au controlleur. Devrais-je séparer les types d'erreurs ou bien englober cela?
    Dois-je mettre un try-catch à chaque endroit ou il peut avoir une erreur?

    Malgré que j'ai regardé quelques articles sur les exceptions j'ai de la difficultés à mettre ça dans un cas concret comme celui-ci.


    Idée comme ça
    Autour de ResolverHttpsPostRequest un try catch exception
    Dans le payment refused, je ferais peut-etre un throw PaymentRefusedException
    Au niveau de la fonction un throws IOException, PaymentRefusedException

    Si quelqu'un pouvait me guider?

    merci

  2. #2
    Membre éclairé Avatar de julien-blaise
    Homme Profil pro
    Développeur Java et C#
    Inscrit en
    Mai 2005
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java et C#

    Informations forums :
    Inscription : Mai 2005
    Messages : 458
    Par défaut
    Hello,

    La réponse va être un peu bateau, mais j'en vois pas de meilleur : tout dépend de ce que tu veux faire.
    Typiquement je remarque qu'a la fin de ta méthode saveCreditCard tu cherches à sauvegarder l'opération que le paiement soit passé ou non. Dans ce cas il faut que ta gestion d'exception te permette de le faire quoiqu'il advienne si c'est l'une des fonctions qu'il te faut absolument remplir.
    En clair demande toi : "Ok j'ai une exception, mais qu'est ce que ça m'empèche de faire ?" ou "Qu'est ce que je veux en faire ?"
    Il peut avoir des erreurs de sauvegarde de donnée (voir les repository save), le payment peut être refusé (j'ai mis un log actuellement), un erreur de connexion à ResolverHttpsPostReques et peut-être d'autre type d'erreur.
    Je me demande comment retourner cela au controlleur. Devrais-je séparer les types d'erreurs ou bien englober cela?
    Dois-je mettre un try-catch à chaque endroit ou il peut avoir une erreur?
    1/ une erreur de sauvegarde doit afficher un message d'erreur, mais doit elle aussi annulé la transaction ? en fonction de ces réponses tu sera peut être amener à gérer les choses différemment.
    2/Est ce que la suite de ton code peut être appelé si le ResolverHttpsPostRequest te refuse la connexion ? a mon avis non, tu peux donc levé une exception catché par l'appellant de ta méthode.

    J'espère que mes réponses t'auront un peu éclairé.

    A+

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Par défaut
    Citation Envoyé par julien-blaise Voir le message
    Hello,
    Typiquement je remarque qu'a la fin de ta méthode saveCreditCard tu cherches à sauvegarder l'opération que le paiement soit passé ou non. Dans ce cas il faut que ta gestion d'exception te permette de le faire quoiqu'il advienne si c'est l'une des fonctions qu'il te faut absolument remplir.
    En clair demande toi : "Ok j'ai une exception, mais qu'est ce que ça m'empèche de faire ?" ou "Qu'est ce que je veux en faire ?"
    en somme la sauvegarde d'opération c'est comme un log, il peut avoir de multiple raison pourquoi l'opération n'es pas passé, on sauvegarde le tout à des fins d'analyse

    Citation Envoyé par julien-blaise Voir le message
    1/ une erreur de sauvegarde doit afficher un message d'erreur, mais doit elle aussi annulé la transaction ? en fonction de ces réponses tu sera peut être amener à gérer les choses différemment.
    si le ResolverHttpsPostRequest réussi, mais que la sauvegarde en local a un problème, je vais logger car le paiement a bien été fait... le rollback ce fait automatiquement il me semble


    Citation Envoyé par julien-blaise Voir le message
    2/Est ce que la suite de ton code peut être appelé si le ResolverHttpsPostRequest te refuse la connexion ? a mon avis non, tu peux donc levé une exception catché par l'appellant de ta méthode.
    non


    donc tu ferais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    @RequestMapping(value = "/members/{memberId}/creditcard", method = RequestMethod.POST)
    public void saveCreditCard(@PathVariable("memberId") Long memberId, @RequestBody CreditCardInfoDto creditCardInfo){
        try{
            paymentService.saveCreditCard(creditCardInfo);
        }catch(Except e){
        }
    }
     
    @Override
        public Long saveCreditCard(CreditCardInfoDto creditCardInfo) throws Exception {
     
            Member member = null;
     
            if (creditCardInfo.getMemberId() != null) {
                member = memberRepository.findOne(creditCardInfo.getMemberId());
            }
     
            List<PaymentGatewayConfig> paymentGateways = paymentGatewayConfigRepository.findAll();
     
            if (paymentGateways != null && !paymentGateways.isEmpty()) {
     
                PaymentGatewayConfig paymentGateway = paymentGateways.get(0);
                String paymentGatewayKey = null;
     
                if (member != null) {
                    paymentGatewayKey = member.getPaymentGatewayKey();
                }
     
                ResolveData resdata = null;
                ResolverReceipt resreceipt = null;
     
                try {
     
                    if (paymentGatewayKey == null) {
     
                        ResAddCC resAddCC = new ResAddCC(creditCardInfo.getCreditCard(), creditCardInfo.getDateExpiration(), "7");
     
                        //resAddCC.setAvsInfo(avsCheck);
                        ResolverHttpsPostRequest mpgReq = new ResolverHttpsPostRequest(paymentGateway.getHost(), paymentGateway.getStoreId(), paymentGateway.getApiToken(), resAddCC);
                        resreceipt = mpgReq.getResolverReceipt();
                        resdata = resreceipt.getResolveData();
     
                        member.setPaymentGatewayKey(resreceipt.getDataKey());
                    } else {
     
                        ResUpdateCC resUpdateCC = new ResUpdateCC(member.getPaymentGatewayKey());
                        resUpdateCC.setPan(creditCardInfo.getCreditCard());
                        resUpdateCC.setExpdate(creditCardInfo.getDateExpiration());
     
                        ResolverHttpsPostRequest mpgReq = new ResolverHttpsPostRequest(paymentGateway.getHost(), paymentGateway.getStoreId(), paymentGateway.getApiToken(), resUpdateCC);
     
                        resreceipt = mpgReq.getResolverReceipt();
                        resdata = resreceipt.getResolveData();
                    }
                } catch (Exception e) {
     
                    log.error("saveCreditCard: " + member.getMemberId() + "ResolverHttpsPostRequest error");
                }
     
                if (resdata != null) {
     
                    //success
                    if (Boolean.valueOf(resreceipt.getComplete()) && !Boolean.valueOf(resreceipt.getTimedOut())) {
                        member.setPaymentGatewayKey(resreceipt.getDataKey());
                        memberRepository.save(member);
                    } else {
                        //payment refused
                        log.error("saveCreditCard: " + member.getMemberId() + " payment refused error code: " + resreceipt.getResponseCode());
                        throw new Exception("Payment refused");
                    }
     
                    Operation operation = createOperation(resreceipt);
                    operationRepository.save(operation);
                }
            }
            return 1l;
        }

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    De manière générale, on envoie une exception pour signaler que la fonction n'a pu être remplie et (souvent) pourquoi.
    Ce qu'on fait de l'exception levée dépend du fonctionnel de ton application.
    Certaines exception seront ignorées, parce qu'on peut contourner le problème en faisant quelque chose de particulier, d'autres non.

    Il faut faire attention également à ne pas trop "catcher" les exceptions, souvent, elles doivent remonter à la source.

    Pour le reste, toi seul connais le fonctionnel, donc à toi de savoir ce qui est fatal et ce qui ne l'est pas
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Par défaut
    je me demande justement comment envoyer l'erreur au client?

    avec le catch dans le controller, l'erreur ne serait pas envoyer au client?

    j'ai vu que certain utilise des responses entity, mais j'ai rien vu encore de très claire concernant spring boot, rest et les bonnes façon de gérer les erreurs.

Discussions similaires

  1. gestion des messages d'erreurs
    Par keibenoit dans le forum Access
    Réponses: 2
    Dernier message: 31/05/2006, 14h49
  2. gestion photo - message d'erreur
    Par xboulney dans le forum Access
    Réponses: 2
    Dernier message: 16/03/2006, 12h45
  3. Traitement d'erreur dans VBA
    Par charleshbo dans le forum VBA Access
    Réponses: 9
    Dernier message: 10/02/2006, 14h03
  4. [servlet] gestion des listes d'erreurs ?
    Par MatMeuh dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 27/10/2004, 10h19
  5. [Postresql] - traitement d'erreurs - resultat pro
    Par Fyna dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/06/2003, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo