Menu
Coddy logo textTech

Error Handling

Parte de la sección Lógica y Flujo del Journey de C# de Coddy — lección 45 de 66.

challenge icon

Desafío

Fácil

Mejoremos nuestro sistema con un manejo robusto de errores para tratar los problemas potenciales de manera elegante. Crea una clase llamada ErrorHandler con estos métodos:

  1. ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex): Valida los índices de entrada y devuelve un mensaje de error apropiado o una cadena vacía si es válido.
    • Devuelve "Invalid student index" si el índice del estudiante está fuera de los límites.
    • Devuelve "Invalid assignment index" si el índice de la tarea está fuera de los límites.
    • Devuelve una cadena vacía "" si ambos índices son válidos.
  2. SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex): Recupera una puntuación de manera segura con manejo de errores.
    • Devuelve la puntuación si ambos índices son válidos.
    • Devuelve -999 si algún índice es inválido.
  3. ProcessBatchUpdate(int[][] scoreGrid, int[][] updates): Procesa actualizaciones por lotes donde cada actualización es [studentIndex, assignmentIndex, score].
    • Devuelve un arreglo string[] de mensajes de error para cada actualización fallida.
    • Cada actualización puede fallar con uno de estos mensajes de error específicos:
      • "Invalid update format" — si la actualización no contiene exactamente 3 valores.
      • "Invalid student index" — si el índice del estudiante está fuera de los límites.
      • "Invalid assignment index" — si el índice de la tarea está fuera de los límites.
      • "Invalid score value" — si la puntuación está fuera del rango válido (0–100).
    • Formatea cada error como: "Error at index X: [specific error message]"
    • Devuelve un arreglo vacío si todas las actualizaciones son exitosas.
Pista: Para recolectar errores dinámicamente antes de devolverlos como un string[], usa List<string> errors = new List<string>();List<string> funciona como un arreglo redimensionable donde puedes llamar errors.Add(...) para agregar elementos. Al final, conviértelo con errors.ToArray(). La importación using System.Collections.Generic; necesaria para esto ya está incluida en la parte superior del archivo.

Pruébalo tú mismo

using System; // No elimines esta línea
using System.Collections.Generic;

public class ErrorHandler
{
    public static string ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex)
    {
        // Escribe tu código aquí
        
    }
    
    public static int SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex)
    {
        // Escribe tu código aquí
        
    }
    
    public static string[] ProcessBatchUpdate(int[][] scoreGrid, int[][] updates)
    {
        // Escribe tu código aquí
        
    }
}

// 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)
    {
        // Comprobar índices fuera de los límites
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length || 
            assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
        {
            return -1;
        }
        
        // Validar la puntuación
        if (!DataCollector.ValidateScore(score))
        {
            return -2;
        }
        
        // Establecer la puntuación
        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)
    {
        // Comprobar si el índice del estudiante es válido
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calcular la suma de puntuaciones válidas
        for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
        {
            int score = scoreGrid[studentIndex][j];
            if (score != -1)  // Ignorar asignaciones no calificadas
            {
                sum += score;
                count++;
            }
        }
        
        // Devolver la media o 0 si no hay puntuaciones válidas
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
    {
        // Comprobar si hay algún estudiante
        if (scoreGrid.Length == 0)
        {
            return -1;
        }
        
        // Comprobar si el índice de la asignación es válido
        if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calcular la suma de puntuaciones válidas para la asignación
        for (int i = 0; i < scoreGrid.Length; i++)
        {
            if (assignmentIndex < scoreGrid[i].Length)
            {
                int score = scoreGrid[i][assignmentIndex];
                if (score != -1)  // Ignorar asignaciones no calificadas
                {
                    sum += score;
                    count++;
                }
            }
        }
        
        // Devolver la media o 0 si no hay puntuaciones válidas
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static int[] FindHighestScore(int[][] scoreGrid)
    {
        int highestStudentIndex = 0;
        int highestAssignmentIndex = 0;
        int highestScore = -1;
        
        // Buscar la puntuación más alta
        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 };
    }
}

Todas las lecciones de Lógica y Flujo