Zig hat keine Ausnahmen. Fehler sind Werte: Eine Funktion mit ! im Rückgabetyp (!i32) liefert entweder einen Fehler oder einen Wert (Error Union). Mit try gibst du einen Fehler an den Aufrufer weiter, mit catch behandelst du ihn. Optionale Werte (?i32) stehen für „kann fehlen“ und ersetzen null; du packst sie mit orelse oder if (x) |wert| aus.
Der Compiler zwingt dich, jeden möglichen Fehler zu behandeln oder weiterzureichen.
const std = @import("std");
const RechenFehler = error{DivisionDurchNull};
fn teile(a: i32, b: i32) RechenFehler!i32 {
if (b == 0) return RechenFehler.DivisionDurchNull;
return @divTrunc(a, b);
}
fn finde(zahlen: []const i32, ziel: i32) ?usize {
for (zahlen, 0..) |z, i| if (z == ziel) return i;
return null;
}
pub fn main() !void {
const ergebnis = teile(10, 2) catch 0;
std.debug.print("{d}\n", .{ergebnis});
const x = try teile(8, 2); // Fehler würde nach oben weitergereicht
std.debug.print("{d}\n", .{x});
if (finde(&[_]i32{ 4, 8, 15 }, 8)) |i| std.debug.print("bei {d}\n", .{i});
}Merke
!Tist ein Fehler oder ein Werttryreicht Fehler weiter,catchbehandelt sie?Tist ein optionaler Wert
Aufgabe
Schreibe eine Funktion, die bei negativen Zahlen einen Fehler liefert, und behandle ihn mit `catch`.