docs: private Throwable createThrowable(String typeName, String message) throws IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException {
  		Class<? extends Throwable> clazz = resolveThrowableClass(typeName);
  
  		Constructor<? extends Throwable> defaultCtr = getDefaultConstructor(clazz);
  		Constructor<? extends Throwable> messageCtr = getMessageConstructor(clazz);
  		
  		if (message != null && messageCtr != null) {
  			return messageCtr.newInstance(message);
  		} else if (message != null && defaultCtr != null) {
  			logger.warn("Unable to invoke message constructor for {}, fallback to default", clazz.getName());
  			return defaultCtr.newInstance();
  		} else if (message == null && defaultCtr != null) {
  			return defaultCtr.newInstance();
  		} else if (message == null && messageCtr != null) {
  			logger.warn("Passing null message to message constructor for {}", clazz.getName());
  			return messageCtr.newInstance((String) null);
  		} else {
  			logger.error("Unable to find message or default constructor for {} have {}", clazz.getName(), clazz.getDeclaredConstructors());
  			return null;
  		}
  	}