Bug 67289 UIPerformChangeOperation swallows exception stacktrace [refactoring]
200406111814 UIPerformChangeOperation#executeChange() swallows the exceptions thrown during change execution: throw new CoreException(exception[0].getStatus()); ... drops the (very informative) stacktrace of exception[0]. Since CoreExceptions cannot be nested, either a nestable subclass of CoreException should be thrown or ... IStatus status= exception[0].getStatus(); throw new CoreException(new MultiStatus( status.getPlugin(), status.getCode(), new IStatus[]{status}, status.getMessage(), exception[0])); ... should be used.
org.eclipse.ltk.ui.refactoring/src/org/eclipse/ltk/internal/ui/refactoring/UIPerformChangeOperation.java
} finally {
							if (cancel != null && !cancel.isDisposed()) {
								cancel.setEnabled(enabled);
							}
						}
					} catch (CoreException e) {
						exception[0]= e;
					} finally {
						Platform.getJobManager().transferRule(rule, callerThread);
					}
				}
			};
			Platform.getJobManager().transferRule(rule, fDisplay.getThread());
			fDisplay.syncExec(r);
			if (exception[0] != null)
				throw new CoreException(exception[0].getStatus());
		} else {
			super.executeChange(pm);
		}
	}
	private Button getCancelButton() {
		if (fWizardContainer instanceof RefactoringWizardDialog2) {
			return ((RefactoringWizardDialog2)fWizardContainer).getCancelButton();
		} else if (fWizardContainer instanceof RefactoringWizardDialog) {
			return ((RefactoringWizardDialog)fWizardContainer).getCancelButton();
		}
		return null;
	}
}