Skip to content

Latest commit

ย 

History

History
131 lines (94 loc) ยท 3.94 KB

File metadata and controls

131 lines (94 loc) ยท 3.94 KB

์˜ˆ์™ธ์ฒ˜๋ฆฌ (throws, throw, do-try-catch)

1. ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์˜ต์…”๋„ ํƒ€์ž…์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์™ธ๋ถ€๋กœ ์ „๋‹ฌํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋กœ Error๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

2. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•  ์˜ค๋ฅ˜๋Š” ์ผ๊ด€๋œ ์ฃผ์ œ์™€ ์—ฐ๊ด€๋œ ๊ฒฝ์šฐ (๋ฌธ์ž์—ด์ด ์žˆ์„ ๋•Œ, ๋ฌธ์ž์—ด ํฌ๊ธฐ, ๋ฌธ์ž์—ด ํ˜•์‹, ๋ฌธ์ž์—ด ํฌ๋งท ํ˜•์‹ ๋“ฑ์˜ ์ฒดํฌ)

  • ์ผ๊ด€๋œ ์ฃผ์ œ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€ enumํ˜• ํƒ€์ž…

2-1. enum์— ์˜ค๋ฅ˜ํƒ€์ž…๋ช… ์ •์˜

// enumํ˜•์œผ๋กœ errorํƒ€์ž…๋ช… ์ •์˜ (ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ์˜ค๋ฅ˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์ผ์ข…์˜ ๊ฐ€๋…์„ฑ ํ‘œ์‹œ)
enum DateParseError : Error {
    case overSizeString
    case incorrectData(part: String)
}

2-2. ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์กฐ๊ฑด์„ ๋ช…์‹œ : throws์™€ thorw๋กœ ์„ ์–ธ

  • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํ‘œํ˜„ : throwsํ‚ค์›Œ๋“œ -> (๋ฐ˜ํ™˜type)

  • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ํ‘œํ˜„ : throw์™€ ์˜ค๋ฅ˜๋ช… ํ‘œ์‹œ (return๊ณผ ์œ ์‚ฌ)

// ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์กฐ๊ฑด์„ throws์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜
func getNextYearAndThrows(paramYear: Int) throws -> Int {
    guard paramYear <= 2020 else {
        throw DataError.overSizeYear
    }
    
    guard paramYear >= 0 else {
        throw DataError.incorrectData(part: paramYear)
    }
    
    return paramYear+1
}

2-3. do - try - catch๋กœ ์ ‘๊ทผ

  • ๋งˆ์ง€๋ง‰ catch์— ์˜ค๋ฅ˜ํƒ€์ž…์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด default๋ฌธ์œผ๋กœ ๋จ

  • try! : ํ•จ์ˆ˜ ๊ฐ•์ œ ์‹คํ–‰ (๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)

  • try? : ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด nil ๋ฐ˜ํ™˜, ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด optional ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜

func getNextYear(paramYear: Int) -> Int {
    var year: Int = 0
    do {
        year = try getNextYearAndThrows(paramYear: paramYear)
    } catch DataError.overSizeYear {
        print("๋…„๋„ ์ดˆ๊ณผํ•ด์„œ ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค")
    } catch DataError.incorrectData(let part){
        print("์ž…๋ ฅํ•œ ๊ฐ’์ด \(part)์ด๋ฏ€๋กœ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.")
    } catch {
        print("default error catch")
    }
    
    return year
}

let a = getNextYear(paramYear: -999) // ์ž…๋ ฅํ•œ ๊ฐ’์ด -999์ด๋ฏ€๋กœ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์ •๋ฆฌ

์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์กฐ๊ฑด์€ ๋”ฐ๋กœ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ (throws, throw)

์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ๋ฌธ์€ ์ง์ ‘ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ณณ์—์„œ ์ฒ˜๋ฆฌ (do - try - catch)

์˜ˆ์‹œ ์ „์ฒด ์ฝ”๋“œ

// enumํ˜•์œผ๋กœ errorํƒ€์ž…๋ช… ์ •์˜
enum DataError : Error { // Error ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ์˜ค๋ฅ˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์ผ์ข…์˜ ๊ฐ€๋…์„ฑ ํ‘œ์‹œ
    case overSizeYear
    case incorrectData(part: Int)
}

// ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์กฐ๊ฑด์„ throws์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜
func getNextYearAndThrows(paramYear: Int) throws -> Int {
    guard paramYear <= 2020 else {
        throw DataError.overSizeYear
    }
    
    guard paramYear >= 0 else {
        throw DataError.incorrectData(part: paramYear)
    }
    
    return paramYear+1
}

// ์‹ค์ œ๋กœ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ถˆ๋Ÿฌ์˜ฌ ํ•จ์ˆ˜
func getNextYear(paramYear: Int) -> Int {
    var year: Int = 0
    do {
        year = try getNextYearAndThrows(paramYear: paramYear)
    } catch DataError.overSizeYear {
        print("๋…„๋„ ์ดˆ๊ณผํ•ด์„œ ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค")
    } catch DataError.incorrectData(let part){
        print("์ž…๋ ฅํ•œ ๊ฐ’์ด \(part)์ด๋ฏ€๋กœ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.")
    } catch {
        print("default error catch")
    }
    
    return year
}

let a = getNextYear(paramYear: -999) // ์ž…๋ ฅํ•œ ๊ฐ’์ด -999์ด๋ฏ€๋กœ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.โ€‹

3. try, try!, try? ์ฐจ์ด

  • try : ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ catch๋กœ ์˜ˆ์™ธ ์ •๋ณด ๋˜์ง€๋ฉฐ, ์„ฑ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ๋ž˜ํ•‘๋œ ๊ฐ’ ๋ฐ˜ํ™˜

  • try! : ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ runtime error, ์„ฑ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ๋ž˜ํ•‘๋œ ๊ฐ’ ๋ฐ˜ํ™˜ (nil๊ฐ’์ด ๋‚˜์˜ค์ง€ ์•Š์Œ์„ ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ)

  • try? : ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ nil ๋ฆฌํ„ด, ์„ฑ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์˜ต์…”๋„ ๊ฐ’ ๋ฐ˜ํ™˜


์ฐธ๊ณ ์ž๋ฃŒ

[swift] 12. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (throws, throw, do - try - catch)