title: Graceful exception handling in Swing Worker
body: <p>I am using threading in application through Swing Worker class. It works fine, yet I have a bad feeling about showing an error message dialog in try-catch block. Can it potentially block the application? This is what it looks right now:</p>
  
  <pre><code>SwingWorker&lt;Void, Void&gt; worker = new SwingWorker&lt;Void, Void&gt;() {
  
      // Executed in background thread
      public Void doInBackground() {
          try {
              DoFancyStuff();
          } catch (Exception e) {
  
              e.printStackTrace();
  
              String msg = String.format("Unexpected problem: %s", e
                      .toString());
  
              //TODO: executed in background thread and should be executed in EDT?
              JOptionPane.showMessageDialog(Utils.getActiveFrame(),
                      msg, "Error", JOptionPane.ERROR_MESSAGE,
                      errorIcon);
  
          }//END: try-catch
  
          return null;
      }
  
      // Executed in event dispatch thread
      public void done() {
          System.out.println("Done");
      }
  };
  </code></pre>
  
  <p>Can it be done in a safe way using Swing Worker framework? Is overriding publish() method a good lead here?</p>
  
  <p><strong>EDIT:</strong></p>
  
  <p>Did it like this:</p>
  
  <pre><code>} catch (final Exception e) {
  
      SwingUtilities.invokeLater(new Runnable() {
  
          public void run() {
  
              e.printStackTrace();
  
              String msg = String.format(
                      "Unexpected problem: %s", e.toString());
  
              JOptionPane.showMessageDialog(Utils
                      .getActiveFrame(), msg, "Error",
                      JOptionPane.ERROR_MESSAGE, errorIcon);
  
          }
      });
  
  }
  </code></pre>
  
  <p>Calling get in done method would result in two try-catch blocks, as the computational part throws exceptions, so I think this is cleaner in the end.</p>