Sérieux problème de gestion d'erreur
Bonjour,
J'ai réaliser un programme comprenant un main, une classe de gestion et une classe d'erreur.
Mon principal problème est due au fait que je ne peux pas gérer deux erreurs différentes.
Quand l'utilisateur apuie sur le bouton initialisé, le programme envoie dans la classe de traitement le chemin puis test celui-ci. Comme le chemin n'existe pas, il va donc lancer une exception avec une erreur. A partir de là on demande à l'utilisateur s'il veut créer le chemin. S'il répond oui, on crée le chemin, sinon non.
On a créer un chemin, comme l'utilisateur est un vrai boulet, il va à nouveau appuyer sur le bouton initialisé et là c'est un autre type d'erreur que l'on a à aficher. Le chemin est correct et actuelement mon code me demande de créer à nouveau le chemin. Donc on ne sait pas faire la différence entre si le chemin est juste ou non (au niveau des erreurs).
Si je résume ce que je veux faire.
1) Le chemin n'est pas présent -> Erreur + voulez-vous créer le chemin
2) Réponse oui -> création du chemin
3) Le chemin est présent -> Erreur + Voulez-vous revenir aux valeurs par défauts
4) Réponse oui -> On procèdera à la réinitialisation des valeurs
Mon main ressemble à ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
import jProperties.*;
import javax.swing.JOptionPane;
//import java.io.*;
public class Form1 extends javax.swing.JFrame {
/** Creates new form Form1 */
public Form1() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTextArea1.setColumns(20);
jTextArea1.setLineWrap(true);
jTextArea1.setRows(5);
jTextArea1.setAutoscrolls(true);
jScrollPane1.setViewportView(jTextArea1);
jMenu1.setText("Initialiser");
jMenu1.setToolTipText("Outils d'initialisation logiciel");
jMenuItem1.setText("Initialiser logiciel");
jMenuItem1.setToolTipText("Créer un fichier properties contenant les paramètres logiciels");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
jMenuItem1.getAccessibleContext().setAccessibleDescription("null");
jMenuBar1.add(jMenu1);
jMenu2.setText("Affichage");
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(288, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
//Initialisation du logiciel
//Chemin du fichier de configuration
//String PathConf = "/home/vpn/appli/conf.properties";
String pathConf = System.getProperty("user.dir") + "/appli/conf.properties";
/*
* Bloc Try/Catch
* GestionProp gère des erreur est doit être dans un bloc sécurisé
*/
try {
//Construit un objet GestionProp
GestionProp Prop = new GestionProp();
//Place le chemin d'un nouveau properties
Prop.setUrl(pathConf);
//Crée un nouveau properties
Prop.create();
}
catch (ErreurGP e) {
/*
* Traitement de l'erreur par choix utilisateur
*/
//Choix de résolution de problème
int choix = JOptionPane.showConfirmDialog(null, "Voulez vous créer le chemin manquant " + pathConf + " ?", "Que voulez-vous faire ?", JOptionPane.ERROR_MESSAGE);
//Traitement des choix
if (choix == JOptionPane.NO_OPTION) {
//On arrêtera le programme
JOptionPane.showMessageDialog(null, "Vous ne pourrez pas profiter pleinement du logiciel sans le fichier " + pathConf + " !", "Information", JOptionPane.INFORMATION_MESSAGE);
} else if (choix == JOptionPane.YES_OPTION) {
//Construit un objet GestionProp
GestionProp Prop = new GestionProp();
//Place le chemin d'un nouveau properties
Prop.setUrl(pathConf);
//Crée un nouveau répertoire
Prop.createPath();
//Crée un nouveau fichier
Prop.createProp();
} else if (choix == JOptionPane.CLOSED_OPTION) {
//On arrêtera le programme
JOptionPane.showMessageDialog(null, "Vous ne pourrez pas profiter pleinement du logiciel sans le fichier " + pathConf + " !", "Information", JOptionPane.INFORMATION_MESSAGE);
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Form1().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration
} |
Ma classe de gestion
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
package jProperties;
import java.io.*;
import java.util.Properties;
import javax.swing.JOptionPane;
public class GestionProp {
/*
* Méthode : Setter
* Action : Place l'url du fichier à traiter dans une variable
* Reçois : Une url, un chemin au format String
*/
public void setUrl(String url) {
this.urlFichier = url;
}
/*
* Méthode : Création
* Action : Crée un fichier en fonction de l'url transmise
* Reçois : Une url, un chemin au format String
*/
public void create() throws ErreurGP {
//Teste la validité du chemin
if(!validPath()) {
/*
* Le chemin existe pas
*
* Erreur via ErreurGP(message, type erreur) Chemin [url] manquant, Répertoire manquant
*/
throw new ErreurGP("Le chemin " + urlFichier + " est manquant\nou le chemin n'existe pas.", "Répertoire ou fichier manquant !");
}
else {
/*
* Le chemin existe
*
* Erreur via ErreurGP(message, type erreur) Chemin [url] présent, Répertoire présent
*/
throw new ErreurGP("Le chemin " + urlFichier + " est présent\nou le chemin existe.", "Répertoire ou fichier présent !");
}
}
/*
* Méthode : Création d'un chemin
* Action : Crée un chemin en fonction de l'url
* Reçois : Une url, un chemin au format String
*/
public void createPath() {
/*
* Crée le répertoire
*/
//Extrait le chemin du répertoire en fonction du contenu d' urlFichier
String newPath = urlFichier.substring(0, urlFichier.lastIndexOf('/'));
//Crée une instance File() pour ce chemin
File file = new File(newPath);
//Crée physiquement le chemin
file.mkdir();
}
/*
* Méthode : Création d'un fichier properties
* Action : Crée un fichier en fonction de l'url
* Reçois : Une url, un chemin au format String
*/
public void createProp() {
/*
* Créer un fichier vide
*/
//Crée une instance Properties()
Properties prop = new Properties();
/*
* Bloc Try/Catch
* Gère des erreur est doit être dans un bloc sécurisé
*/
try {
//Crée une instance OutputStream()
OutputStream propFile = new FileOutputStream(urlFichier);
//Crée une instance OutputStreamWriter() pour passer en UTF-8
OutputStreamWriter propCreate = new OutputStreamWriter(propFile, "UTF-8");
//Crée un nouveau fichier avec un commentaire
prop.store(propCreate, "@Autor");
//Ferme le flux de création de fichier
propCreate.flush();
propCreate.close();
}
catch(FileNotFoundException e) {
//Indique les ereurs
e.printStackTrace();
}
catch(IOException e) {
//Indique les ereurs
e.printStackTrace();
}
}
/*
* Méthode : Tester
* Action : Tester la validité d'un chemin depuis l'url locale
* Reçois : Une url, un chemin au format String
* Retourne : Un true ou un False en fonction du chemin
* */
public boolean validPath() {
//Si le chemin existe et si il est disponible
if(new File(urlFichier).exists()) {
return true; //Retourner vrai
}
else {
return false; //Sinon retourner faux
}
}
/*
* Champ de la classe GestionProp
*/
private String urlFichier;
} |
Et enfin, ma classe posant problème, comme le reste d'ailleurs car le fonctionnement n'est pas correct. La classe d'ereur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
package jProperties;
import javax.swing.JOptionPane;
public class ErreurGP extends Exception {
/*
* Méthode : Affichage
* Action : Crée une exception si une erreur survient
* Reçois : Une url, un chemin au format String
*/
public ErreurGP(String msgErreur, String typeErreur) {
this.message = msgErreur; //Message d'erreur
this.typeErr = typeErreur; //Type de l'erreur
JOptionPane.showMessageDialog(null, message, typeErr, JOptionPane.ERROR_MESSAGE);
}
/*
* Méthode : Getter
* Action : Affiche l'erreur au programmeur ou à l'utilisateur
* Reçois : Rien
*/
public String getErreur() {
return this.message;
}
/*
* Les méthodes de la classe ErreurUrl
*/
private String message;
private String typeErr;
} |
J'aimerais ne pas avoir à tout refaire mais j'avoue que comme je trouve mon main plutôt chargé je me tâte.
Existe-il un moyen de gérer par plusieurs catch ?
Comment rendre ma classe d'erreur utilisable ?
Enfin pourquoi dès que je veux ajouter une nouvelle erreur dans ma classe d'erreur celle-ci est considéré en erreur ?