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
private Display fDisplay;
	private IWizardContainer fWizardContainer;
	
	public UIPerformChangeOperation(Display display, Change change, IWizardContainer container) {
		super(change);
		fDisplay= display;
		fWizardContainer= container;
	}
	public UIPerformChangeOperation(Display display, CreateChangeOperation op, IWizardContainer container) {
		super(op);
		fDisplay= display;
		fWizardContainer= container;
	}
	
	protected void executeChange(final IProgressMonitor pm) throws CoreException {
		if (fDisplay != null && !fDisplay.isDisposed()) {
			final CoreException[] exception= new CoreException[1];
			final ISchedulingRule rule= ResourcesPlugin.getWorkspace().getRoot();
			final Thread callerThread= Thread.currentThread();
			Runnable r= new Runnable() {
				public void run() {
					try {
						final Button cancel= getCancelButton();
						boolean enabled= true;
						if (cancel != null && !cancel.isDisposed()) {
							enabled= cancel.isEnabled();
							cancel.setEnabled(false);
						}
						try {
							UIPerformChangeOperation.super.executeChange(pm);