swift throw throws rethrows do-try-catch defer

enum ErrorCode: Error {
    case divideZero
    case none
    
    var str: String {
        switch self {
        case .divideZero:
            return "divided by zero"
        default:
            return "not defined"
        }
    }
}

//예외를 던지는 함수는 throws 표기
func divide(_ a: Double, _ b: Double) throws -> Double {
    if b == 0.0 {
        throw ErrorCode.divideZero
    }
    return a/b
}

extension Int {
    //예외를 던지는 함수를 호출하고 do-try-catch 하지 않으면 rethrows 로 예외 던짐
    func divide(_ a: Int, fn: (Double, Double) throws -> Double) rethrows -> Int {
        try Int(fn(Double(self), Double(a)))
    }
}
func something() {
    var ret = -1
    defer { print("divide result \(ret)") }
    do {
        ret = try 10.divide(0, fn: divide(_:_:))
    } catch let err {
        print("\((err as? ErrorCode)?.str ?? "")")
    }
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다