public <T> T evaluateData(IManagedData<T> managedData) throws Exception {
		boolean done = false;
		int tries = 0;
		T data = null;
		while (!done && tries < retries) {
			tries++;
			Throwable t = null;
			try {
				data = evaluateDataOnce(managedData);
				done = true;
			} catch (InvalidClassException e) {
				t = e;
			} catch (NotSerializableException e) {
				done = true;
				t = e;
			} catch (RuntimeException e) {
				t = e;
			} catch (Exception e) {
				t = e;
			}
			if (t != null) {
				boolean removed = removeDataFromManagement(managedData.getID());
				logger.warn("exception getting " + managedData.getID() + " on try " + tries, t);

				if (!removed) {
					throw new RuntimeException("couldn't remove " + managedData.getID());
				}
			}
		}
		if (data == null) {
			throw new Exception("couldn't get data " + managedData.getID());
		} else {
			return data;
		}
	}