Das Konzept von Fehlern
Teil des Abschnitts Grundlagen der GO-Journey von Coddy. Lektion 102 von 109.
In Go sind Fehler Werte, die darauf hinweisen, dass etwas schiefgelaufen ist. Go behandelt Fehler explizit, anstatt Exceptions zu verwenden.
Erstellen wir eine Funktion, die beim Dividieren von Zahlen einen Fehler erzeugen könnte:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Diese Funktion gibt zwei Werte zurück: das Ergebnis der Division und einen potenziellen Fehler. Wenn der Divisor Null ist, geben wir eine Fehlermeldung zurück, anstatt die Division zu versuchen.
Nun verwenden wir unsere Funktion und behandeln mögliche Fehler:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Nach der Ausführung dieses Codes wird eine Fehlermeldung auf dem Bildschirm angezeigt, da wir versucht haben, durch Null zu teilen:
Error: cannot divide by zeroDies demonstriert das Fehlerbehandlungsmuster von Go: prüfen Sie, ob ein Fehler aufgetreten ist (err != nil), und ergreifen Sie dann entsprechende Maßnahmen. Wenn kein Fehler aufgetreten ist, können wir das Ergebnis sicher verwenden.
Aufgabe
EinfachIn dieser Aufgabe übst du den Umgang mit Fehlern in Go. Du erstellst eine Funktion, die zwei Zahlen dividiert und einen Fehler zurückgibt, wenn eine Division durch null versucht wird.
Deine Aufgabe ist es:
- Die Funktion
dividezu vervollständigen, die zwei Ganzzahlen entgegennimmt und ihren Quotienten sowie einen Fehler zurückgibt. - Wenn der Divisor null ist, 0 und einen Fehler mit der Meldung "division by zero" zurückzugeben.
- Wenn die Division gültig ist, das Ergebnis und
nilfür den Fehler zurückzugeben. - In der Funktion
maindividemit den bereitgestellten Werten aufzurufen und alle Fehler angemessen zu behandeln.
Diese Übung zeigt, wie Go-Funktionen üblicherweise ein Ergebnis und einen Fehler zurückgeben und wie man diese Fehler überprüft und behandelt.
Probier es selbst
package main
import (
"errors"
"fmt"
)
// divide teilt a durch b und gibt das Ergebnis zurück
// Wenn b 0 ist, wird ein Fehler zurückgegeben
func divide(a, b int) (int, error) {
// TODO: Implementiere die divide-Funktion
// Wenn b 0 ist, gib 0 und einen Fehler mit der Nachricht "division by zero" zurück
// Andernfalls gib a/b und nil für den Fehler zurück
}
func main() {
// Erster Testfall
a, b := 10, 2
result, err := divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
// Zweiter Testfall
a, b = 8, 0
result, err = divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
4Vergleichs- und logische Operatoren
Vergleichsoperatoren – Teil 1Vergleichsoperatoren – Teil 2Logischer UND-OperatorLogischer ODER-OperatorLogischer NICHT-OperatorGrundlagen der OperatorrangfolgeZusammenfassung – Vergleiche durchführen7Kontrollfluss: Schleifen
Die `for`-Schleife erklärt`for`-Schleife – Grundlagen`for`-Schleife – nur BedingungDas Schlüsselwort `break`Das Schlüsselwort `continue`Verschachtelte SchleifenWiederholung – Aktionen wiederholen2Variablen und grundlegende Datentypen
Was ist eine VariableTypinferenz mit `:=`Ganzzahlen (int)GleitkommazahlenBoolesche WerteZeichenkettenNullwerteKonstantenNamenskonventionenRückblick – Variablen und Typen5Grundlegende Ein- und Ausgabe
Formatierte AusgabeFormatierungsverbenDatentypen ausgebenGrundlegende Benutzereingaben erhaltenRückblick – Ein- und Ausgabe8Funktionen
Funktionen verstehenEine Funktion deklarierenFunktionen aufrufenFunktionsparameterEinen einzelnen Wert zurückgebenMehrere Werte zurückgebenBenannte RückgabewerteGrundlagen des FunktionsumfangsRückblick – Wiederverwendbaren Code erstellen11Zusammengesetzte Datentypen: Slices
Einführung in SlicesSlice-Literale deklarierenSlices mit `make` erstellenSlice-Länge vs. KapazitätAuf Slice-Elemente zugreifenElemente anhängenVorhandene Slices/Arrays aufteilenÜber Slices iterierenSlices kopierenRückblick – Dynamische Listen14Grundlegende Fehlerbehandlung
Das Konzept von FehlernDas `error`-InterfaceFunktionen, die Fehler zurückgebenAuf Fehler prüfenEinfache Fehler erstellenFormatierte Fehler erstellenGrundlegende FehlerbehandlungZusammenfassung – Probleme behandeln3Grundlegende Operatoren
Arithmetische OperatorenDivisionsoperatorDer Modulo-OperatorZuweisungsoperatorErweiterte ZuweisungsoperatorenInkrement und DekrementRückblick – Berechnungen6Kontrollfluss: Bedingungen
Die `if`-AnweisungDas `else`-SchlüsselwortDas `else if`-SchlüsselwortVariablen-Shadowing in `if`Variablen initialisierenDie `switch`-AnweisungSwitch mit AusdrückenSwitch ohne AusdruckDas `fallthrough`-SchlüsselwortZusammenfassung – Entscheidungen treffen9Zeiger
Was ist ein Zeiger?Zeigervariablen deklarierenDer AdressoperatorZeiger dereferenzierenZeiger in Funktionen verwendenNil-ZeigerRückblick – Zeiger verstehen12Zusammengesetzte Datentypen: Maps
Einführung in MapsMap-Literale deklarierenMaps mit `make` erstellenSchlüssel-Wert-Paare hinzufügen und aktualisierenAuf Map-Werte zugreifenDas Vorhandensein eines Schlüssels prüfenMap-Einträge löschenLänge von MapsMaps durchlaufenZusammenfassung – Schlüssel-Wert-SpeicherungÜbe selbstständig: Online-Go-Compiler