챗지피티

Zig는 C와 유사한 저수준 시스템 프로그래밍 언어이지만, 예외 처리 방식이 기존의 C++이나 Java와 다릅니다.

1. Zig의 예외 처리 방식

Zig에서는 예외(Exception) 개념이 없고, 대신 오류(Error) 핸들링을 명시적으로 처리하는 방식을 사용합니다.

✔ ! 연산자를 이용한 오류 전파(Error Propagation)

fn mightFail() !i32 { return error.SomeError; // 오류 발생 } fn main() !void { const value = try mightFail(); // 오류가 발생하면 main도 오류 반환 _ = value; }

mightFail() 함수는 !i32를 반환 → 즉, i32 값이거나 오류(error.SomeError)가 될 수 있음.

try를 사용하여 오류를 자동 전파(error propagation)할 수 있음.

2. catch를 사용한 오류 처리

Zig에서는 catch를 사용하여 오류를 잡고 처리할 수 있음.

fn mightFail() !i32 { return error.SomeError; } fn main() void { const value = mightFail() catch -1; // 오류 발생 시 -1 반환 std.debug.print("Result: {}\n", .{value}); }

catch 키워드를 사용하여 오류 발생 시 기본 값을 제공.

mightFail()이 오류를 반환하면 -1이 대신 할당됨.

3. switch를 사용한 오류 매칭

Zig의 switch문을 사용하면 오류 유형별로 다르게 처리할 수 있음.

fn mightFail() !i32 { return error.FileNotFound; } fn main() void { const result = mightFail() catch |err| switch (err) { error.FileNotFound => -1, error.PermissionDenied => -2, else => -99, }; std.debug.print("Result: {}\n", .{result}); }

특정 오류 유형별로 다른 값을 반환할 수 있음.

else를 사용하여 나머지 오류를 처리 가능.

4. errdefer를 사용한 정리 코드 실행

Zig에서는 errdefer를 사용하면 오류가 발생했을 때만 실행되는 정리(clean-up) 코드를 작성할 수 있음.

const std = @import("std"); fn example() !void { const file = try std.fs.cwd().openFile("data.txt", .{}); errdefer file.close(); // 오류 발생 시 파일 닫기 // 파일 작업 수행... }

errdefer는 함수가 오류를 반환하는 경우 실행됨.

defer와 달리 정상적으로 실행될 때는 실행되지 않음.

결론

Zig는 **C++의 예외 처리(exception handling)**를 사용하지 않음.

대신, ! 연산자를 이용한 오류 전파, catch, switch, errdefer 등을 활용한 오류 처리를 제공.

시스템 프로그래밍에서 예외보다 명시적인 오류 반환이 더 안전하고 예측 가능하다는 철학을 따름.


---
"도둑은 집을 떠나며 주인을 욕한다" - 러시아 속담