public static void handleExecutionError(@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 = getNotificationGroup().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);
    });
  }
public static void handleExecutionError(@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)