2010-01-15 5 views
35

Je lisais les documents de publication Android et ils ont dit de supprimer tous les appels de journal de mon code. J'ai quelques appels à e.printStackTrace() dans mon code qui peut être imprimé dans le cadre du fonctionnement normal de mon programme (c'est-à-dire si un fichier n'existe pas encore).Dois-je supprimer e.printStackTrace() de mon code avant de publier

Dois-je également supprimer ces appels?

Répondre

43

Vous ne devriez pas utiliser e.printStackTrace() directement de toute façon — faisant envoie les informations dans le journal Android sans afficher quelle application (balise log) il est venu.

Comme d'autres l'ont mentionné, continuez à attraper le Exception en question, mais utilisez l'une des méthodes android.util.Log pour effectuer la journalisation. Vous pouvez vous connecter seulement le message, mais pas la trace de la pile, ou utiliser la journalisation détaillée pour la trace de la pile:

try { 
    Object foo = null; 
    foo.toString(); 
} catch (NullPointerException ex) { 
    Log.w(LOG_TAG, "Foo didn't work: "+ ex.getMessage()); 
    Log.d(LOG_TAG, Util.stackTraceWriter(ex)); 
} 

Vous devez enlever DEBUG ou VERBOSE messages du journal de votre production construit. Le plus simple est de use ProGuard to remove Log.[dv] calls à partir de votre code.

+11

il semble que 'Util.stackTraceWriter' ne soit plus là. Quoi qu'il en soit, il y a cette ['Log.getStackTraceString'] (http://developer.android.com/reference/android/util/Log.html#getStackTraceString%28java.lang.Throwable%29) – superjos

+0

Vous n'êtes pas autorisé à utiliser les journaux lorsque vous vouloir publier l'application! –

+0

@SoheilSetayeshi Qu'est-ce qui vous fait penser à ça? Vérifiez les journaux de votre téléphone; vous verrez beaucoup de journaux provenant d'applications installées. –

0

à mon humble avis (je ne suis pas un développeur Android)

Il devrait être agréable. Je ne connais pas les options de journalisation pour Android mais je suis sûr que vous avez quelque chose configurable pour produire (ou non) vos traces.

Et si vous ne faites pas printStackTrace() Android ne fera pas le sale boulot de l'ignorer.

:)

Il est seulement une bonne chose sentiment (de style).

+0

J'ai compris qu'Android l'ignore ... est-ce correct? – helios

3

Si vous autorisez une exception à se propager jusqu'au système d'exploitation, le système d'exploitation l'enregistrera et ouvrira également une fenêtre de fermeture forcée, détruisant votre application. Si vous l'attrapez, vous pouvez empêcher la fermeture forcée de votre application.

Si vous souhaitez que vos utilisateurs aient la possibilité de vous envoyer les erreurs qu'ils reçoivent, je consignerai la trace de la pile. Ils peuvent ensuite vous envoyer le journal via une application comme Log Collector.

Si vous voulez éviter la possibilité d'exposer vos informations de trace de pile à vos utilisateurs, alors attrapez l'exception et ne la consignez pas.

2

Je voudrais utiliser la classe Log pour la sortie de message. Pour les journaux qui vous semblent importants pour rester dans l'application - utilisez Log.i pour les erreurs d'avertissement - Log.e Log.w Pour vous déboguer Log.d - et que vous pouvez désactiver sur base si votre application est en cours de débogage mode.

http://developer.android.com/reference/android/util/DebugUtils.html

1

Eh bien printStackTrace() consignera dans le système d'exploitation, ce qui provoque votre application andorid (ou l'ordinateur) de mettre fin à (la force de fermeture), au contraire, faire quelque chose comme ceci:

public void nullPointerExceptionCauser() 
{ 
     try 
     { 
      Object example = null; 
      example.toString(); 
     } 
     catch (Exception e) 
     { 
      Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace()); 
     } 
} 
-1

Utilisez cette option pour supprimer les journaux de sortie apk

if (BuildConfig.DEBUG) Log.d(TAG, "your meseage"); 
0

Si vous voulez être sûr c'est-à-direpas permettre à quiconque fouiner à lire les journaux d'exception que vous pouvez faire quelque chose comme

private void hideExceptionsInReleaseMode() 
{ 
    final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); 

    if(!BuildConfig.DEBUG) 
    { 
     Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
      { 
       @Override 
       public void uncaughtException(Thread thread, Throwable ex) 
       { 
        defaultHandler.uncaughtException(thread, new RuntimeException("Something went wrong :p")); 
       } 
      }); 
    } 
} 
0

Pour utiliser printStackTrace de manière plus sûre j'utiliser StringWrite et PrintWriter:

... 
catch (final Exception e) 
{ 
    final StringWriter sw = new StringWriter(); 
    final PrintWriter pw = new PrintWriter(sw); 
    e.printStackTrace(pw); 
    Log.e("TAG", sw.toString()); 
} 

Ou bien:

catch (final Exception e) 
{ 
    Log.e(TAG, Log.getStackTraceString(e)); 
}