Menu
Coddy logo textTech

throws와 Error

Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 44번째.

Swift는 함수가 실패할 수 있음을 선언하도록 함으로써 에러를 처리합니다. 함수 본문은 에러 값을 던지며, 호출자는 이를 처리해야 합니다.

에러 타입은 내장된 Error 프로토콜을 준수하는 모든 것을 의미합니다. 자신만의 에러 타입을 선언하는 가장 간단한 방법은 열거형(enum)을 사용하는 것입니다:

enum InputError: Error {
    case empty
    case tooLong
}

에러를 던지는 함수(throwing function)는 시그니처에 throws 키워드를 사용하고 본문에 throw 문을 사용합니다:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

에러를 던지는 함수를 직접 호출할 수는 없으며, 컴파일러는 개발자가 에러를 처리하도록 강제합니다. 다음 레슨에서 그 방법을 다룹니다.

challenge icon

챌린지

쉬움

두 가지 케이스 negativetooBig을 가진 열거형 NumError: Error를 정의하세요.

다음과 같은 동작을 하는 던지기 함수(throwing function) doubleSafely(_ n: Int) throws -> Int를 정의하세요:

  • n < 0일 때 .negative를 던집니다.
  • n > 100일 때 .tooBig을 던집니다.
  • 그렇지 않으면 n * 2를 반환합니다.

stdin에서 정수 하나를 읽습니다. do/catch 블록 내에서 doubleSafely를 호출하세요 (정확한 형태는 다음 레슨에서 배우게 됩니다. 지금은 아래의 골격을 그대로 사용하세요):

do {
    let result = try doubleSafely(n)
    print("ok: \(result)")
} catch NumError.negative {
    print("negative")
} catch NumError.tooBig {
    print("too big")
} catch {
    print("unknown")
}

입력이 10인 경우 출력은 ok: 20입니다. -1인 경우 negative입니다. 500인 경우 too big입니다.

치트 시트

Error 프로토콜을 준수하는 열거형(enum)을 사용하여 에러 타입을 정의합니다:

enum InputError: Error {
    case empty
    case tooLong
}

함수가 에러를 던질 수 있음을 나타내기 위해 throws를 사용하고, 에러를 발생시키기 위해 throw를 사용합니다:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

에러를 던지는 함수는 에러 처리(예: do/catch)와 함께 호출되어야 합니다. 컴파일러가 이를 강제합니다.

직접 해보기

let n = Int(readLine()!)!

// 할 일: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨