YAMLException - HelmDefense/HelmDefense GitHub Wiki

La gestion des exceptions YAMLException

Quel est le sens de cette exception ?

Cette exception est levée lorsqu'une erreur intervient sur de la lecture ou de l'écriture de données avec la librairie SnakeYAML. Elle signifie que quelque chose ne s'est pas passé comme prévu et que soit des données n'ont pas été correctement chargées, soit pas correctement sauvegardées. Dans les deux cas il s'agit d'une exception fatale.

Quand est-ce que cette exception est susceptible de survenir ?

Modification du JAR

Actuellement, les données des entités et des niveaux étant stockées directement à l'intérieur de l'archive JAR, tant que l'utilisateur n'a pas modifié les données à la main il n'est normalement pas possible qu'elle soit levée à ce moment là.

Emplacement de sauvegarde

En revanche, si l'accès au dossier "home" de l'utilisateur n'est pas possible pour une raison X ou Y, lors de la sauvegarde ou le chargement des options cette exception peut arriver.

Mauvaise syntaxe ou données erronées

Enfin, il est possible (si vous avez essayé de modifier le JAR, et notamment les données des entités) que ces dernières soit erronées et devenues illisibles, ce qui déclenche cette exception.

Que faut-il faire si on rencontre cette exception ?

Vérification manuelle

Comme expliqué plus haut, il n'est normalement pas possible d'avoir cette exception si vous n'avez pas édité le JAR. Si c'est le cas, téléchargez une version propre. Sinon, ou si le problème persiste, essayez de vérifier les droits d'accès sur votre dossier /Users/<username/ sur Linux et MacOS et C:\Users\<username>\ sur Windows.

Dans le code

Il n'y a actuellement aucune fonctionnalité dans le code qui analyseraient pourquoi l'exception a été levée, mais il serait envisageable de concevoir un système qui demande automatiquement à l'utilisateur de sélectionner un autre emplacement de sauvegarde (le principal problème est qu'il faudrait se souvenir de cet emplacement, et donc le stocker, mais où puisqu'on ne peut pas le stocker à l'emplacement justement...).

Exemples

Voici quelques exemples extraits des classes du package fr.helmdefense.yaml.

private static void loadOptions() {
	File options = new File(YAMLWriter.STORAGE, YAML.DATA_FOLDER + "/options.yml");
	if (! options.exists()) {
		try {
			YAMLWriter.saveDefaultOptions();
		} catch (IOException e) {
			throw new YAMLException("Failed to save default options", e);
		}
		loadedOptions = YAMLLoader.load(YAML.DATA_FOLDER + "/options.yml");
	}
	else {
		loadedOptions = YAMLLoader.loadAbsolute(options.getAbsolutePath());
	}
}

Exemple d'utilisation : Le chargement des options depuis la classe YAMLLoader

public static YAMLData loadAbsolute(String file) {
	try {
		return new YAMLData(YAML.get().load(new FileReader(file)));
	} catch (FileNotFoundException e) {
		throw new YAMLException("Cannot load file \"" + file + "\"", e);
	}
}

Exemple d'utilisation : Le chargement d'un fichier yml depuis la classe YAMLLoader

try {
	FileWriter writer = new FileWriter(STORAGE + "/" + YAML.DATA_FOLDER + "/options.yml");
	YAML.get().dump(data, writer);
} catch (IOException e) {
	throw new YAMLException("Failed to save options in file \"" + STORAGE + "/" + YAML.DATA_FOLDER + "/options.yml\"", e);
}

Exemple d'utilisation : La sauvegarde du fichier options.yml depuis la classe YAMLWriter (simplifiée)

public int getInt(String path, int def) {
	Object obj = this.get(path);
	try {
		return obj == null ? def : ((Number) obj).intValue();
	} catch (ClassCastException e) {
		throw new YAMLException("Cannot return data in specified format!", e);
	}
}

Exemple d'utilisation : La récupération d'un entier depuis un ensemble de données yml depuis la classe YAMLData

Notes complémentaires

Nous pouvons noter dans la classe YAMLLoader (principalement) d'autres cas de gestion d'exceptions, mais d'exceptions "classiques" (IllegalArgumentException, IndexOutOfBoundsException, etc...), que je tenais tout de même à souligner. En voici un exemple :

private static List<Object> abilitiesParams(List<?> data) {
	List<Object> list = new ArrayList<Object>(data);
	
	try {
		list.set(0, Tier.valueOf(list.get(0).toString().toUpperCase()));
	} catch (IllegalArgumentException | IndexOutOfBoundsException e) {
		list.add(0, Tier.DEFAULT);
	}
	
	try {
		list.set(1, Tier.Specification.valueOf(list.get(1).toString().toUpperCase()));
	} catch (IllegalArgumentException | IndexOutOfBoundsException e) {
		list.add(1, Tier.Specification.DEFAULT);
	}
	
	return list;
}

Exemple d'utilisation : L'analyse des paramètres pour les capacités (afin de rendre le tier facultatif dans le game_data/entities.yml) depuis la classe YAMLLoader

⚠️ **GitHub.com Fallback** ⚠️