void (@NotNull Project project, @NotNull String toolWindowId, @NotNull Throwable e, @Nls String title, @Nullable @DialogMessage String description, @NotNull Function<? super @DialogMessage String, @DialogMessage String> fullMessageSupplier, @Nullable HyperlinkListener listener) { if (StringUtil.isEmptyOrSpaces(description)) { LOG.warn("Execution error without description", e); description = ExecutionBundle.message("dialog.message.unknown.error"); } String fullMessage = fullMessageSupplier.apply(description); if (ApplicationManager.getApplication().isUnitTestMode()) { LOG.error(fullMessage, e); } else { LOG.info(fullMessage, e); } if (e instanceof ProcessNotCreatedException) { LOG.debug("Attempting to run: " + ((ProcessNotCreatedException)e).getCommandLine().getCommandLineString()); } if (listener == null) { listener = ExceptionUtil.findCause(e, HyperlinkListener.class); } HyperlinkListener _listener = listener; String _description = description; UIUtil.invokeLaterIfNeeded(() -> { if (project.isDisposed()) { return; } Notification notification = ourNotificationGroup.createNotification(title, _description, NotificationType.ERROR); notification.setToolWindowId(toolWindowId); if (_listener != null) { notification.setListener((_notification, event) -> { if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { _notification.expire(); _listener.hyperlinkUpdate(event); } }); } notification.notify(project); }); }