2010-05-13 5 views
4

ErrorDialog.openError prend des arguments pour le titre de la boîte de dialogue, le message et l'état (qui a un message lui-même).JFace ErrorDialog: comment afficher quelque chose dans la partie détails?

Je souhaite afficher le message d'exception dans la zone principale et la pile d'appels dans la zone de détails. Cependant, ces deux variations montrent la pile d'appels dans la zone principale:

void showException(Throwable e) { 
    Status status = 
     new Status(IStatus.ERROR, "SCS Admin", e.getLocalizedMessage(), e); 
    e.printStackTrace; 
    ErrorDialog.openError(getShell(), null, Util.getStackTrace(e), status); 
} 

void showException(Throwable e) { 
    Status status = 
     new Status(IStatus.ERROR, "SCS Admin", Util.getStackTrace(e), e); 
    e.printStackTrace; 
    ErrorDialog.openError(getShell(), null, e.getLocalizedMessage(), status); 
} 

Comment puis-je passer autour?

Répondre

7

Par défaut, JFace ErrorDialog seul moyen d'afficher la trace de la pile d'exception complète (identique à produit par printStackTrace()) consiste à créer chaque ligne de la trace de la pile comme un seul état. Et enfin définissez ces statuts en tant qu'enfant de MultiStatus.

est ici par exemple de la méthode utilitaire que j'utilise dans nos applications RCP:

/** 
* Shows JFace ErrorDialog but improved by constructing full stack trace in 
* detail area. 
*/ 
public static void errorDialogWithStackTrace(String msg, Throwable t) { 

    StringWriter sw = new StringWriter(); 
    PrintWriter pw = new PrintWriter(sw); 
    t.printStackTrace(pw); 

    final String trace = sw.toString(); // stack trace as a string 

    // Temp holder of child statuses 
    List<Status> childStatuses = new ArrayList<>(); 

    // Split output by OS-independend new-line 
    for (String line : trace.split(System.getProperty("line.separator"))) { 
     // build & add status 
     childStatuses.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, line)); 
    } 

    MultiStatus ms = new MultiStatus(Activator.PLUGIN_ID, IStatus.ERROR, 
      childStatuses.toArray(new Status[] {}), // convert to array of statuses 
      t.getLocalizedMessage(), t); 

    ErrorDialog.openError(null, PxConstants.DIALOG_TITLE, msg, ms); 
} 
1

On dirait que vous mélangez les paramètres 2nd et 3rd sur openError. Le 3ème paramètre est le message à afficher. Puisque vous donnez le stacktrace, il le montre.

Une fois que vous aurez réglé cela, vous voudrez peut-être envisager d'utiliser un MultiStatus.

+0

Ceci est un commentaire, pas une réponse à la question originale. –

3

Vous pouvez envelopper l'exception d'un nouveau contenant le stacktrace comme message.

public void showException(final Exception ex) { 
    Display.getDefault().syncExec(new Runnable() { 
     @Override 
     public void run() { 
      StringWriter sw = new StringWriter(); 
      ex.printStackTrace(new PrintWriter(sw)); 
      IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, ex.getMessage(), new Exception(sw.toString())); 
      ErrorDialog.openError(Display.getDefault().getActiveShell(), "Error", null, status); 
     } 
    }); 
} 
Questions connexes