code: public static void onOperatorError(String key, BiFunction<? super Throwable, Object, ? extends Throwable> onOperatorError) {
  		Objects.requireNonNull(key, "key");
  		Objects.requireNonNull(onOperatorError, "onOperatorError");
  		log.debug("Hooking onOperatorError: {}", key);
  		synchronized (log) {
  			onOperatorErrorHooks.put(key, onOperatorError);
  			onOperatorErrorHook = createOrUpdateOpErrorHook(onOperatorErrorHooks.values());
  		}
  	}
docs: Add or replace a named custom error mapping, overriding the default one. Custom
  mapping can be an accumulation of several sub-hooks each subsequently added via this
  method.
  <p>
  Note that invoking this method twice with the same key will replace the old sub-hook
  with that name, but keep the execution order (eg. A-h1, B-h2, A-h3 will keep A-B
  execution order, leading to hooks h3 then h2 being executed). Removing a particular
  key using {@link #resetOnOperatorError(String)} then adding it back will result in
  the execution order changing (the later sub-hook being executed last).
  Can be fully reset via {@link #resetOnOperatorError()}.
  <p>
  For reference, the default mapping is to unwrap the exception and, if the second
  parameter is another exception, to add it to the first as a suppressed.
  
  @param key the key for the sub-hook to add/replace
  @param onOperatorError an operator error {@link BiFunction} mapper, returning an arbitrary exception
  given the failure and optionally some original context (data or error).
  
  @see #onOperatorError(String, BiFunction)
  @see #resetOnOperatorError(String)
  @see #resetOnOperatorError()