Grundlagen der Fehlerbehandlung
Teil des Abschnitts Grundlagen der GO-Journey von Coddy — Lektion 108 von 109.
Grundlegende Fehlerbehandlung ist ein grundlegendes Muster in Go, bei dem man nach Operationen, die fehlschlagen könnten, auf Fehler prüft.
Lernen wir, wie man Fehler in Go behandelt, indem wir eine einfache Divisionsfunktion erstellen, die einen Fehler zurückgibt, wenn durch Null geteilt wird:
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}Diese Funktion gibt zwei Werte zurück: das Ergebnis der Division und einen Fehler. Wenn der Divisor Null ist, gibt sie eine Fehlermeldung zurück, anstatt die Division zu versuchen.
Sehen wir uns nun an, wie man diese Funktion verwendet und mögliche Fehler behandelt:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error occurred:", err)
return // Ausführung stoppen oder den Fehler behandeln
}
fmt.Println("Result:", result)Nach der Ausführung dieses Codes prüfen wir mithilfe der Bedingung if err != nil, ob ein Fehler aufgetreten ist. Da wir versucht haben, durch Null zu teilen, gibt die Funktion einen Fehler zurück, und Folgendes wird auf dem Bildschirm angezeigt:
Error occurred: division by zeroDieses Muster, einen Fehler als letzten Rückgabewert zurückzugeben und ihn sofort zu prüfen, ist in Go sehr verbreitet. Es ermöglicht Ihrem Programm, Fehler kontrolliert zu behandeln, anstatt abzustürzen.
Aufgabe
EinfachIn dieser Herausforderung wirst du die grundlegende Fehlerbehandlung in Go üben. Du hast eine Funktion, die zwei Zahlen dividiert, aber eine Division durch Null verursacht einen Laufzeitfehler. Deine Aufgabe ist es, eine Fehlerbehandlung hinzuzufügen, um diesen Absturz zu verhindern.
Der Code verfügt bereits über eine Funktion, die sowohl ein Ergebnis als auch einen Fehler zurückgibt. Du musst prüfen, ob ein Fehler vorliegt, bevor du das Ergebnis verwendest.
Spickzettel
In Go geben Funktionen, die fehlschlagen könnten, einen Fehler als letzten Rückgabewert zurück:
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}Prüfen Sie auf Fehler mit if err != nil:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error occurred:", err)
return // Ausführung stoppen oder den Fehler behandeln
}
fmt.Println("Result:", result)Dieses Muster ermöglicht es Programmen, Fehler kontrolliert zu behandeln, anstatt abzustürzen.
Probier es selbst
package main
import (
"errors"
"fmt"
)
// Diese Funktion teilt x durch y und gibt einen Fehler zurück, wenn y Null ist
func divide(x, y float64) (float64, error) {
if y == 0 {
return 0, errors.New("cannot divide by zero")
}
return x / y, nil
}
func main() {
// Testwerte
numerator := 10.0
denominator := 0.0
// Rufe die divide-Funktion auf
result, err := divide(numerator, denominator)
// TODO: Überprüfen, ob err nicht nil ist (es liegt ein Fehler vor)
// Wenn ein Fehler vorliegt, gib ihn mit fmt.Println(err) aus
// Andernfalls gib das Ergebnis mit fmt.Printf("Result: %.2f\n", result) aus
// Entferne diese Zeile und implementiere oben eine ordnungsgemäße Fehlerbehandlung
fmt.Printf("Result: %.2f\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- & logische Operatoren
Vergleichsoperatoren - Teil 1Vergleichsoperatoren - Teil 2Logischer UND-OperatorLogischer ODER-OperatorLogischer NICHT-OperatorGrundlagen der OperatorrangfolgeZusammenfassung - Vergleiche anstellen7Kontrollfluss: Schleifen
Die `for`-Schleife erklärtfor-Schleife - Grundlagenfor-Schleife - Nur BedingungDas `break`-SchlüsselwortDas `continue`-SchlüsselwortVerschachtelte SchleifenZusammenfassung - Aktionen wiederholen2Variablen und grundlegende Datentypen
Was ist eine VariableTypinferenz mit `:=`Ganzzahlen (int)GleitkommazahlenBoolesche WerteStringsZero ValuesKonstantenNamenskonventionenZusammenfassung - Variablen und Typen5Grundlagen der Ein- und Ausgabe
Formatierte AusgabeFormat-VerbenTypen ausgebenEinfache Benutzereingaben erhaltenZusammenfassung – Ein- und Ausgabe8Funktionen
Funktionen verstehenEine Funktion deklarierenFunktionen aufrufenFunktionsparameterEinen einzelnen Wert zurückgebenMehrere Werte zurückgebenBenannte RückgabewerteGrundlagen des Funktions-ScopesZusammenfassung – Wiederverwendbaren Code erstellen11Zusammengesetzte Typen: Slices
Einführung in SlicesDeklaration von Slice-LiteralenSlices mit `make` erstellenSlice-Länge vs. KapazitätZugriff auf Slice-ElementeElemente anhängenSlicing von bestehenden Slices/ArraysIterieren über SlicesKopieren von SlicesZusammenfassung – Dynamische Listen14Grundlagen der Fehlerbehandlung
Das Konzept von FehlernDas `error`-InterfaceFunktionen, die Fehler zurückgebenFehler prüfenEinfache Fehler erstellenFormatierte Fehler erstellenGrundlagen der FehlerbehandlungZusammenfassung – Probleme behandeln3Grundlegende Operatoren
Arithmetische OperatorenDivisionsoperatorDer Modulo-OperatorZuweisungsoperatorKombinierte ZuweisungsoperatorenInkrement und DekrementZusammenfassung - Berechnungen6Kontrollfluss: Bedingte Anweisungen
Die `if`-AnweisungDas `else`-SchlüsselwortDas `else if`-SchlüsselwortVariable Shadowing in `if`Variablen initialisierenDie `switch`-AnweisungSwitch mit AusdrückenSwitch ohne AusdruckDas `fallthrough`-SchlüsselwortZusammenfassung – Entscheidungen treffen9Zeiger
Was ist ein Zeiger?Deklarieren von ZeigervariablenDer AdressoperatorDereferenzieren von ZeigernVerwendung von Zeigern in FunktionenNil-ZeigerZusammenfassung – Zeiger verstehen12Zusammengesetzte Typen: Maps
Einführung in MapsDeklarieren von Map-LiteralenErstellen von Maps mit `make`Hinzufügen und Aktualisieren von Key-Value-PaarenZugriff auf Map-WerteÜberprüfen der Existenz von SchlüsselnLöschen von Map-EinträgenMap-LängeIterieren über MapsZusammenfassung – Key-Value-Speicher