Bug 80608 SWT.error does not initialize the causing exception.
SWTException stores the "cause" exception in a public field named "throwable". This prevents access to the causing exception in a standard way, the Exception.getCause method. SWT.error should call initCause to set this up.
bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/InternalErrorDialog.java
data.horizontalSpan = 2;
        text.setLayoutData(data);
    }
    /** 
     * Convenience method to open a simple Yes/No question dialog.
     *
     * @param parent the parent shell of the dialog, or <code>null</code> if none
     * @param title the dialog's title, or <code>null</code> if none
     * @param message the message
     * @return <code>true</code> if the user presses the OK button,
     *    <code>false</code> otherwise
     */
    public static boolean openQuestion(Shell parent, String title,
            String message, Throwable detail, int defaultIndex) {
        String[] labels;
        if (detail == null)
            labels = new String[] { IDialogConstants.YES_LABEL,
                    IDialogConstants.NO_LABEL };
        else
            labels = new String[] { IDialogConstants.YES_LABEL,
                    IDialogConstants.NO_LABEL,
                    IDialogConstants.SHOW_DETAILS_LABEL };
        InternalErrorDialog dialog = new InternalErrorDialog(parent, title,
                null, 
                message, detail, QUESTION, labels, defaultIndex);
        if (detail != null)
            dialog.setDetailButton(2);
        return dialog.open() == 0;
    }
}