Menu
Coddy logo textTech

Tratamento de Erros

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 um tratamento robusto de erros para lidar adequadamente 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 forem válidos.
    • Retorna "Invalid student index" se o índice do estudante 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 nota com segurança, utilizando tratamento de erros.
    • Retorna a nota 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, nas quais cada atualização é [studentIndex, assignmentIndex, score].
    • Retorna um array string[] de mensagens de erro para cada atualização que falhar.
    • 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 estudante estiver fora dos limites.
      • "Invalid assignment index": se o índice da tarefa estiver fora dos limites.
      • "Invalid score value": se a nota 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 no qual 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 início do arquivo.

Experimente você mesmo

using System; // Não apague 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
        
    }
}

// Necessário para testes - não modificar
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 pontuação
        if (!DataCollector.ValidateScore(score))
        {
            return -2;
        }
        
        // Defina a pontuação
        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)
    {
        // Check if student index is valid
        if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calcule a soma das pontuações válidas
        for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
        {
            int score = scoreGrid[studentIndex][j];
            if (score != -1)  // Ignore tarefas não avaliadas
            {
                sum += score;
                count++;
            }
        }
        
        // Retorne a média ou 0 se não houver pontuações válidas
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
    {
        // Verifique se há algum aluno
        if (scoreGrid.Length == 0)
        {
            return -1;
        }
        
        // Check if assignment index is valid
        if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
        {
            return -1;
        }
        
        int sum = 0;
        int count = 0;
        
        // Calcule a soma das pontuações válidas para a tarefa
        for (int i = 0; i < scoreGrid.Length; i++)
        {
            if (assignmentIndex < scoreGrid[i].Length)
            {
                int score = scoreGrid[i][assignmentIndex];
                if (score != -1)  // Ignore tarefas não avaliadas
                {
                    sum += score;
                    count++;
                }
            }
        }
        
        // Retorne a média ou 0 se não houver pontuações válidas
        return count > 0 ? (double)sum / count : 0;
    }
    
    public static int[] FindHighestScore(int[][] scoreGrid)
    {
        int highestStudentIndex = 0;
        int highestAssignmentIndex = 0;
        int highestScore = -1;
        
        // Busque a pontuação mais 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 as lições de Lógica & Fluxo

Pratique por conta própria: Compilador de C# online