Gestion des erreurs
Fait partie de la section Logique & Flux du Journey C# de Coddy — leçon 45 sur 66.
Défi
FacileAméliorons notre système avec une gestion d'erreurs robuste pour gérer les problèmes potentiels avec élégance. Créez une classe appelée ErrorHandler avec ces méthodes :
ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex): Valide les indices d'entrée et retourne un message d'erreur approprié ou une chaîne vide si valide.- Retourne
"Invalid student index"si l'indice de l'étudiant est hors limites. - Retourne
"Invalid assignment index"si l'indice de l'affectation est hors limites. - Retourne une chaîne vide
""si les deux indices sont valides.
- Retourne
SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex): Récupère en toute sécurité un score avec gestion d'erreurs.- Retourne le score si les deux indices sont valides.
- Retourne
-999si un indice est invalide.
ProcessBatchUpdate(int[][] scoreGrid, int[][] updates): Traite les mises à jour par lots où chaque mise à jour est[studentIndex, assignmentIndex, score].- Retourne un tableau
string[]de messages d'erreur pour chaque mise à jour échouée. - Chaque mise à jour peut échouer avec l'un de ces messages d'erreur spécifiques :
"Invalid update format"— si la mise à jour ne contient pas exactement 3 valeurs."Invalid student index"— si l'indice de l'étudiant est hors limites."Invalid assignment index"— si l'indice de l'affectation est hors limites."Invalid score value"— si le score est en dehors de la plage valide (0–100).
- Formatez chaque erreur comme :
"Error at index X: [specific error message]" - Retournez un tableau vide si toutes les mises à jour sont réussies.
- Retourne un tableau
string[], utilisez List<string> errors = new List<string>(); — List<string> fonctionne comme un tableau redimensionnable où vous pouvez appeler errors.Add(...) pour ajouter des éléments. À la fin, convertissez-le avec errors.ToArray(). L'import using System.Collections.Generic; nécessaire pour cela est déjà inclus en haut du fichier.Essayez vous-même
using System; // Ne supprimez pas cette ligne
using System.Collections.Generic;
public class ErrorHandler
{
public static string ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex)
{
// Écrivez votre code ici
}
public static int SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex)
{
// Écrivez votre code ici
}
public static string[] ProcessBatchUpdate(int[][] scoreGrid, int[][] updates)
{
// Écrivez votre code ici
}
}
// Required for testing - do not modify
public class DataCollector
{
public static int[][] CreateScoreGrid(int students, int assignments)
{
int[][] scoreGrid = new int[students][];
for (int i = 0; i < students; i++)
{
scoreGrid[i] = new int[assignments];
}
return scoreGrid;
}
public static bool ValidateScore(int score)
{
return score >= 0 && score <= 100;
}
public static int[][] PopulateWithDefaultValues(int[][] scoreGrid)
{
for (int i = 0; i < scoreGrid.Length; i++)
{
for (int j = 0; j < scoreGrid[i].Length; j++)
{
scoreGrid[i][j] = -1;
}
}
return scoreGrid;
}
}
public class DataEntry
{
public static int SetStudentScore(int[][] scoreGrid, int studentIndex, int assignmentIndex, int score)
{
// Vérifier les indices hors limites
if (studentIndex < 0 || studentIndex >= scoreGrid.Length ||
assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
{
return -1;
}
// Valider la note
if (!DataCollector.ValidateScore(score))
{
return -2;
}
// Définir la note
scoreGrid[studentIndex][assignmentIndex] = score;
return 0;
}
public static int UpdateAllScores(int[][] scoreGrid, int[] studentIndices, int assignmentIndex, int score)
{
int successCount = 0;
for (int i = 0; i < studentIndices.Length; i++)
{
int result = SetStudentScore(scoreGrid, studentIndices[i], assignmentIndex, score);
if (result == 0)
{
successCount++;
}
}
return successCount;
}
}
public class DataAnalyzer
{
public static double CalculateStudentAverage(int[][] scoreGrid, int studentIndex)
{
// Vérifier si l'index de l'étudiant est valide
if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
{
return -1;
}
int sum = 0;
int count = 0;
// Calculer la somme des notes valides
for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
{
int score = scoreGrid[studentIndex][j];
if (score != -1) // Ignorer les devoirs non notés
{
sum += score;
count++;
}
}
// Retourner la moyenne ou 0 s'il n'y a pas de notes valides
return count > 0 ? (double)sum / count : 0;
}
public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
{
// Vérifier s'il y a des étudiants
if (scoreGrid.Length == 0)
{
return -1;
}
// Vérifier si l'index du devoir est valide
if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
{
return -1;
}
int sum = 0;
int count = 0;
// Calculer la somme des notes valides pour le devoir
for (int i = 0; i < scoreGrid.Length; i++)
{
if (assignmentIndex < scoreGrid[i].Length)
{
int score = scoreGrid[i][assignmentIndex];
if (score != -1) // Ignorer les devoirs non notés
{
sum += score;
count++;
}
}
}
// Retourner la moyenne ou 0 s'il n'y a pas de notes valides
return count > 0 ? (double)sum / count : 0;
}
public static int[] FindHighestScore(int[][] scoreGrid)
{
int highestStudentIndex = 0;
int highestAssignmentIndex = 0;
int highestScore = -1;
// Rechercher la note la plus élevée
for (int i = 0; i < scoreGrid.Length; i++)
{
for (int j = 0; j < scoreGrid[i].Length; j++)
{
int currentScore = scoreGrid[i][j];
if (currentScore > highestScore)
{
highestScore = currentScore;
highestStudentIndex = i;
highestAssignmentIndex = j;
}
}
}
return new int[] { highestStudentIndex, highestAssignmentIndex, highestScore };
}
}Toutes les leçons de Logique & Flux
1Tableaux multidimensionnels
Bases des tableaux 2DDéclaration et initialisation en 2DAccès aux éléments d'un tableau 2DBoucles imbriquées et tableaux 2DTableaux irréguliersOpérations matricielles courantesRécapitulatif - Multidimensionnel4Techniques de contrôle de flux
Retours anticipésClauses de gardeInstructions de saut (goto)Break et ContinueAplatir les conditionnelles imbriquées2Prise de décision avancée
Conditions multiplesLogique booléenne complexeComparaison If vs SwitchInstructions Switch imbriquéesRécapitulatif - Décisions avancées5Gestion des exceptions
Bases du Try-CatchTypes d'exceptionsBlocs Catch multiplesManipulation de fichiersLe bloc FinallyUsing vs Try-FinallyExceptions personnaliséesRécapitulatif - Gestion des erreurs8Système d'analyse de données
Configuration de la collecte de donnéesLogique de saisie de données3Améliorations des boucles
Performance des bouclesItération de structures complexesChaque type de boucleRefactorisation des bouclesRécapitulatif - Boucles optimisées6Gestion des valeurs nulles
Les bases des références nullesTypes valeur nullablesPatterns de vérification de nullitéProgrammation défensiveRécapitulatif - Null Safety