docs: protected AjaxExceptionHandler findHandlerComponent(FacesContext context, Throwable rootCause) {
          AjaxExceptionHandlerVisitCallback visitCallback = new AjaxExceptionHandlerVisitCallback(rootCause);
  
          context.getViewRoot().visitTree(VisitContext.createVisitContext(context), visitCallback);
  
          Map<String, AjaxExceptionHandler> handlers = visitCallback.getHandlers();
  
          // get handler by exception type
          AjaxExceptionHandler handler = handlers.get(rootCause.getClass().getName());
  
          // lookup by inheritance hierarchy
          if (handler == null) {
              Class throwableClass = rootCause.getClass();
              while (handler == null && throwableClass.getSuperclass() != Object.class) {
                  throwableClass = throwableClass.getSuperclass();
                  handler = handlers.get(throwableClass.getName());
              }
          }
  
          // get default handler
          if (handler == null) {
              handler = handlers.get(null);
          }
  
          return handler;
      }