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

Composants FMX Delphi Discussion :

[Android] Problème lors de la propagation d'exception


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 251
    Par défaut [Android] Problème lors de la propagation d'exception
    Bonjour à tous,

    Autrefois dans mes folles années de jeunesse quand je développais des application Windows en Delphi, j'avais pour habitude d'avoir une procédure générale qui était appelée en cas d'exception apparaissant dans l'application

    procedure AppException(Sender:TObject; E: Exception);
    Il suffisait d'écrire dans le TForm.Create un

    Application.OnException:=AppException;
    Et l'affaire était jouée en cas d'erreur dans une procédure, un try...except propageait l'exception à l'aide d'un ""raise Exception.Create" et la proc en question faisait son office...


    Dans le cas d'une app Android, je constate que la propagation des exceptions ne se fait pas comme je le voudrais (quand je propage l'erreur à l'aide d'un raise, l'exception qui n'est pas traitée au niveau du dessus est perdue et ne se propage pas jusqu'au niveau de l'app), y aurait-il une notion qui aurait changée pour le traitement d'erreur avec Android ou avec les dernières versions de Delphi?

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    ça devrait fonctionner de la même façon

    tu es sur quelle version de Delphi ?

    tu utilises des threads dans ton application mobile ?

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 251
    Par défaut
    Citation Envoyé par pprem Voir le message
    ça devrait fonctionner de la même façon

    tu es sur quelle version de Delphi ?

    tu utilises des threads dans ton application mobile ?
    Dans le projet en question, j'utilise Delphi 10.4.2 parce que le passage à la version 11 exige trop de modifications du code existant. A noter que cette version Delphi 10.4.2 a un gros bug: Si on veut régler les paramètres de la fonte d'un texte, on a droit à une fenêtre blanche en mode pop-up qui bloque Delphi... On est obligé de tuer la tâche Delphi (en perdant tout le code que l'on n'aurait pas sauvegardé) puis relancer Delphi.

    Il y a des threads mais uniquement pour des tâches expressément lancées par l'utilisateur. Ils ne sont pas actifs quand j'ai mes problèmes de propagation.

    Le problème de propagation des erreurs ou pas (et oui parce que dans certaines parties du code, la propagation se fait "normalement") intervient dans le cadre d'une procédure/fonction dans laquelle il y a une structure try try... except... finally. Certaines fois, lorsque l'on propage l'erreur depuis l'except ou même depuis le finally, l'exception arrive au niveau du dessus (où la procédure/fonction a été appelée... Je l'ai testé) mais ne poursuit pas sa propagation jusqu'au niveau de l'application.

    C'est un projet complexe. Vu que tu es une référence Delphi, si tu me dis qu'il n'y a pas eu de modifications du comportement au niveau de Delphi, je suppose qu'il y a un code parasite qui capture de manière non-voulue la propagation de certaines exceptions.

    Je suis bon pour jouer au chien truffier détecteur de bug

  4. #4
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Citation Envoyé par Anselme45 Voir le message
    Je suis bon pour jouer au chien truffier détecteur de bug
    je crains que la chasse ne soit ouverte

    vérifie quand même que tu n'as pas un "except end" vide quelque part dans la pile d'appel des endroits dont tu ne vois pas les exceptions et dans ce cas n'oublie pas d'y faire un raise si tu veux qu'elle remonte (ou le virer s'il est vide et que ce n'est pas réellement intentionnel et voulu et réfléchi et fait exprès)

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    2 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2 251
    Par défaut
    Bonjour à tous,

    Je ramène les fruits de ma chasse

    La cause de non-propagation des exceptions jusqu'à la racine de l'application est due au composant TDataWedgeBroadcastListener.

    Sur réception de données, la procédure TDataWedgeBroadcastListener.onReceive(context: JContext; intent: JIntent) se déclenche et lance du code.

    Toute exception déclenchée par le code en question se propage jusqu'à cette procédure mais pas au-delà.


    La mise en oeuvre de ce TDataWedgeBroadcastListener est basée sur un sample fourni par Embarcadero.

    1. L'objet est créé dans la procedure TForm1.FormCreate(Sender: TObject) par un "DataWedgeBroadcastListener:=TDataWedgeBroadcastListener.Create();" et le create n'accepte pas de paramètre.

    2. Dans l'unité, des types sont déclarés en lien avec le composant TDataWedgeBroadcastListener,

    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
     
    Type
     
      TDataWedgeDataEvent  = procedure(Sender: TObject; const Data: string) of object;
     
      TDataWedgeBroadcastListener = class(TJavaLocal, JFMXBroadcastReceiverListener)
      private
        FReceiver: JBroadcastReceiver;
        FOnData: TDataWedgeDataEvent;
      public
        { JFMXBroadcastReceiverListener }
        procedure onReceive(context: JContext; intent: JIntent); cdecl;
      public
        constructor Create;
        destructor Destroy; override;
        property OnData: TDataWedgeDataEvent read FOnData write FOnData;
      end;
     
    ---
     //Une variable globale...
      DataWedgeBroadcastListener:TDataWedgeBroadcastListener;
     
    ...
     
    constructor TDataWedgeBroadcastListener.Create;
    var
      LIntentFilter: JIntentFilter;
    begin
      inherited;
      FReceiver := TJFMXBroadcastReceiver.JavaClass.init(Self);
      LIntentFilter := TJIntentFilter.JavaClass.init;
      LIntentFilter.addAction(StringToJString('com.xxx.ACTION')); // or whatever value the profile is configured for
      LIntentFilter.addCategory(StringToJString('android.intent.category.DEFAULT'));
      TAndroidHelper.Context.registerReceiver(FReceiver, LIntentFilter);
    end;
     
    //***
    destructor TDataWedgeBroadcastListener.Destroy;
    begin
      TAndroidHelper.Context.unregisterReceiver(FReceiver);
      inherited;
    end;

    Au final ce composant fonctionne mais ne se considère pas comme ayant un lien de "parenté" avec l'application. J'ai codé un traitement d'exception au niveau de TDataWedgeBroadcastListener.onReceive qui fait le même travail que le traitement d'exception à la racine de l'app mais est-ce que quelqu'un pourrait m'indiquer une méthode pour que le fils ingrat TDataWedgeBroadcastListener se rappelle qu'il a de la famille

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    alors je ne connais pas TDataWedgeBroadcastListener mais ça sent le thread secondaire

    par exemple dans ce code
    https://github.com/DelphiWorlds/Kast...ng.Android.pas

    on a bien un Synchronize pour déclencher le l'évènement

    est-ce le cas de ton component ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ceci fonctionne en tout cas
    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnException := AppException;
    end;
     
    procedure TForm1.AppException(Sender: TObject; E: Exception);
    begin
      Label1.Text := 'App Exception: ' + E.Message;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      raise Exception.Create('Message d''erreur');
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Problème lors d’appeler .apk+ Android
    Par ensinienne dans le forum Android
    Réponses: 5
    Dernier message: 25/01/2025, 07h15
  2. Problème lors de la gestion des exceptions
    Par Greatzo dans le forum Langage
    Réponses: 2
    Dernier message: 01/05/2019, 13h04
  3. Problème lors de la compilation d'une application Android
    Par JonasYounes dans le forum Android
    Réponses: 0
    Dernier message: 03/01/2015, 15h42
  4. Réponses: 3
    Dernier message: 25/11/2014, 22h00
  5. Problème lors de la création d'un projet Android
    Par arnotec dans le forum Android
    Réponses: 1
    Dernier message: 28/08/2012, 09h46

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