Menu
Coddy logo textTech

Error Handling

Parte da seção Lógica & Fluxo do Journey de C# da Coddy — lição 45 de 66.

challenge icon

Desafio

Fácil

Vamos aprimorar nosso sistema com tratamento robusto de erros para lidar graciosamente com possíveis problemas. Crie uma classe chamada ErrorHandler com estes métodos:

  1. ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex): Valida os índices de entrada e retorna uma mensagem de erro apropriada ou uma string vazia se válido.
    • Retorna "Invalid student index" se o índice do aluno estiver fora dos limites.
    • Retorna "Invalid assignment index" se o índice da tarefa estiver fora dos limites.
    • Retorna uma string vazia "" se ambos os índices forem válidos.
  2. SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex): Recupera uma pontuação de forma segura com tratamento de erros.
    • Retorna a pontuação se ambos os índices forem válidos.
    • Retorna -999 se algum índice for inválido.
  3. ProcessBatchUpdate(int[][] scoreGrid, int[][] updates): Processa atualizações em lote onde cada atualização é [studentIndex, assignmentIndex, score].
    • Retorna um array string[] de mensagens de erro para cada atualização falha.
    • Cada atualização pode falhar com uma destas mensagens de erro específicas:
      • "Invalid update format" — se a atualização não contiver exatamente 3 valores.
      • "Invalid student index" — se o índice do aluno estiver fora dos limites.
      • "Invalid assignment index" — se o índice da tarefa estiver fora dos limites.
      • "Invalid score value" — se a pontuação estiver fora do intervalo válido (0–100).
    • Formate cada erro como: "Error at index X: [specific error message]"
    • Retorne um array vazio se todas as atualizações forem bem-sucedidas.
Dica: Para coletar erros dinamicamente antes de retorná-los como um string[], use List<string> errors = new List<string>();List<string> funciona como um array redimensionável onde você pode chamar errors.Add(...) para adicionar itens. No final, converta-o com errors.ToArray(). A importação using System.Collections.Generic; necessária para isso já está incluída no topo do arquivo.

Experimente você mesmo

using System; // Não remova esta linha
using System.Collections.Generic;

public class ErrorHandler
{
    public static string ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex)
    {
        // Escreva seu código aqui
        
    }
    
    public static int SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex)
    {
        // Escreva seu código aqui
        
    }
    
    public static string[] ProcessBatchUpdate(int[][] scoreGrid, int[][] updates)
    {
        // Escreva seu código aqui
        
    }
}

// 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)
    {
        // Verifique índices fora dos limites
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length || 
            assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
        {
            return -1;
        }
        
        // Valide a nota
        if (!DataCollector.ValidateScore(score))
        {
            return -2;
        }
        
        // Defina a nota
        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)
    {
        // Verifique se o índice do aluno é válido
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calcule a soma das notas válidas
        for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
        {
            int score = scoreGrid[studentIndex][j];
            if (score != -1)  // Ignore atribuições não avaliadas
            {
                sum += score;
                count++;
            }
        }
        
        // Retorne a média ou 0 se não houver notas válidas
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
    {
        // Verifique se há alunos
        if (scoreGrid.Length == 0)
        {
            return -1;
        }
        
        // Verifique se o índice da atribuição é válido
        if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calcule a soma das notas válidas para a atribuição
        for (int i = 0; i < scoreGrid.Length; i++)
        {
            if (assignmentIndex < scoreGrid[i].Length)
            {
                int score = scoreGrid[i][assignmentIndex];
                if (score != -1)  // Ignore atribuições não avaliadas
                {
                    sum += score;
                    count++;
                }
            }
        }
        
        // Retorne a média ou 0 se não houver notas válidas
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static int[] FindHighestScore(int[][] scoreGrid)
    {
        int highestStudentIndex = 0;
        int highestAssignmentIndex = 0;
        int highestScore = -1;
        
        // Procure pela maior nota
        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 as lições de Lógica & Fluxo