Error Handling
Teil des Abschnitts Logik & Ablauf der C#-Journey von Coddy — Lektion 45 von 66.
Aufgabe
EinfachLassen Sie uns unser System mit robuster Fehlerbehandlung erweitern, um potenzielle Probleme elegant zu handhaben. Erstellen Sie eine Klasse namens ErrorHandler mit diesen Methoden:
ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex): Validiert die Eingabeindizes und gibt eine passende Fehlermeldung oder einen leeren String zurück, wenn gültig.- Gibt
"Invalid student index"zurück, wenn der Studentenindex außerhalb der Grenzen liegt. - Gibt
"Invalid assignment index"zurück, wenn der Aufgabenindex außerhalb der Grenzen liegt. - Gibt einen leeren String
""zurück, wenn beide Indizes gültig sind.
- Gibt
SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex): Holt sicher einen Score mit Fehlerbehandlung ab.- Gibt den Score zurück, wenn beide Indizes gültig sind.
- Gibt
-999zurück, wenn ein Index ungültig ist.
ProcessBatchUpdate(int[][] scoreGrid, int[][] updates): Verarbeitet Batch-Updates, wobei jedes Update[studentIndex, assignmentIndex, score]ist.- Gibt ein
string[]-Array mit Fehlermeldungen für jedes fehlgeschlagene Update zurück. - Jedes Update kann mit einer dieser spezifischen Fehlermeldungen fehlschlagen:
"Invalid update format"— wenn das Update nicht genau 3 Werte enthält."Invalid student index"— wenn der Studentenindex außerhalb der Grenzen liegt."Invalid assignment index"— wenn der Aufgabenindex außerhalb der Grenzen liegt."Invalid score value"— wenn der Score außerhalb des gültigen Bereichs (0–100) liegt.
- Formatieren Sie jeden Fehler als:
"Error at index X: [specific error message]" - Geben Sie ein leeres Array zurück, wenn alle Updates erfolgreich sind.
- Gibt ein
string[] zurückgegeben werden, verwenden Sie List<string> errors = new List<string>(); — List<string> funktioniert wie ein skalierbares Array, bei dem Sie errors.Add(...) aufrufen können, um Elemente anzuhängen. Am Ende konvertieren Sie es mit errors.ToArray(). Der benötigte Import using System.Collections.Generic; ist bereits oben in der Datei enthalten.Probier es selbst
using System; // Diese Zeile nicht löschen
using System.Collections.Generic;
public class ErrorHandler
{
public static string ValidateInput(int[][] scoreGrid, int studentIndex, int assignmentIndex)
{
// Schreibe deinen Code hier
}
public static int SafeGetScore(int[][] scoreGrid, int studentIndex, int assignmentIndex)
{
// Schreibe deinen Code hier
}
public static string[] ProcessBatchUpdate(int[][] scoreGrid, int[][] updates)
{
// Schreibe deinen Code hier
}
}
// 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)
{
// Prüfe auf Indizes außerhalb der Grenzen
if (studentIndex < 0 || studentIndex >= scoreGrid.Length ||
assignmentIndex < 0 || assignmentIndex >= scoreGrid[studentIndex].Length)
{
return -1;
}
// Validiere die Punktzahl
if (!DataCollector.ValidateScore(score))
{
return -2;
}
// Setze die Punktzahl
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)
{
// Prüfe, ob der Studentenindex gültig ist
if (studentIndex < 0 || studentIndex >= scoreGrid.Length)
{
return -1;
}
int sum = 0;
int count = 0;
// Berechne Summe der gültigen Punktzahlen
for (int j = 0; j < scoreGrid[studentIndex].Length; j++)
{
int score = scoreGrid[studentIndex][j];
if (score != -1) // Ignoriere nicht benotete Aufgaben
{
sum += score;
count++;
}
}
// Gib Durchschnitt oder 0 zurück, falls keine gültigen Punktzahlen
return count > 0 ? (double)sum / count : 0;
}
public static double CalculateAssignmentAverage(int[][] scoreGrid, int assignmentIndex)
{
// Prüfe, ob Studenten vorhanden sind
if (scoreGrid.Length == 0)
{
return -1;
}
// Prüfe, ob der Aufgabenindex gültig ist
if (assignmentIndex < 0 || assignmentIndex >= scoreGrid[0].Length)
{
return -1;
}
int sum = 0;
int count = 0;
// Berechne Summe der gültigen Punktzahlen für die Aufgabe
for (int i = 0; i < scoreGrid.Length; i++)
{
if (assignmentIndex < scoreGrid[i].Length)
{
int score = scoreGrid[i][assignmentIndex];
if (score != -1) // Ignoriere nicht benotete Aufgaben
{
sum += score;
count++;
}
}
}
// Gib Durchschnitt oder 0 zurück, falls keine gültigen Punktzahlen
return count > 0 ? (double)sum / count : 0;
}
public static int[] FindHighestScore(int[][] scoreGrid)
{
int highestStudentIndex = 0;
int highestAssignmentIndex = 0;
int highestScore = -1;
// Suche nach der höchsten Punktzahl
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 };
}
}Alle Lektionen in Logik & Ablauf
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling8Data Analysis System
Data Collection SetupData Entry Logic3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety