2

J'ai écrit ma propre exception (MyException) et mis en œuvre la journalisation et l'affichage des messages d'erreur sous forme de toasts. En voici la forme abrégée ...Mon "MyException" qui montre Toast provoque des problèmes tout en jetant dans les discussions. Comment dois-je réorganiser la gestion des exceptions?

public class MyException extends Exception { 

    public MyException(String msg) { 
     Looper.prepare(); 
     Toast.makeText(Controller.getInstance().getApplicationContext(), msg , Toast.LENGTH_LONG).show(); 
     //Looper.loop(); 
     Looper.myLooper().quit(); 
    } 
} 

Tout allait bien jusqu'à ce que je mette maintenant en œuvre Threads où des exceptions sont levées et interceptées.

Vous avez probablement déjà vu, que j'ai joué avec la classe Looper, mais honnêtement, je ne sais pas comment le faire fonctionner. Est-ce la bonne approche? Vous pouvez également voir que je stocke déjà une référence de ApplicationContext dans mon contrôleur. Dois-je le faire avec le ActivityContext et ensuite faire le Toast à partir de ce ActivityContext? (Mais j'ai entendu dire que ce n'est pas une bonne pratique en termes de performance)

Mise à jour

Est-ce la façon dont je devrais aller, quand une exception est pris dans un fil dans une ity activ?

private Runnable exceptionCatchingThread = new Runnable() { 
      @Override 
      public void run() { 
      try { 
       throw new Exception(); 
      } catch (Exception e) { 
       this.e = e; 
       runOnUiThread(handleThreadExceptions); } 
      } 
    } 

private Runnable handleThreadExceptions = new Runnable() { 
      @Override 
       public void run() { 
       //Show toast or call the general ExceptionHandler, 
       //which is doing logging and stuff 
       Helper.handleException(e); 
       } 
} 

Répondre

3

Un Exception doit être utilisé pour signaler à l'appelant qu'un problème est survenu. Il est de la responsabilité de l'appelant de faire quelque chose avec cette notification, ce journal, ces toasts, etc. Vous ne devriez pas faire cela dans la classe Exception elle-même.

Vous pouvez créer une méthode d'assistance à appeler lorsque vous interceptez une exception qui effectue le grillage, etc. Si vous souhaitez effectuer cela à partir de plusieurs activités, vous pouvez créer une fonction util où vous passez dans le contexte.

public static void displayExceptionMessage(Context context, String msg) { 
Toast.makeText(context, msg , Toast.LENGTH_LONG).show(); 
} 

et dans votre activité:

try { 
    // something that causes Exception 
} catch (MyException e) { 
    Helper.displayExceptionMessage(this, e.getMessage()); 
} 
+0

Vous pouvez jeter un oeil à ma mise à jour si tu veux – OneWorld

+0

Oui, cela pourrait fonctionner. Une meilleure solution pourrait être d'utiliser AsyncTask. Je pense qu'il a pris en charge la notification d'une exception sur le thread de l'interface utilisateur. –