λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

swift λ¬Έλ²•πŸ–€

[SWIFT] μ—λŸ¬ 처리 (Error Handling)

μ—λŸ¬(였λ₯˜)의 μ’…λ₯˜

  • 컴파일 였λ₯˜ (문법적 μ—λŸ¬)
    • μ½”λ“œμ˜ μˆ˜μ •μ„ 톡해 ν•΄κ²°
  • λŸ°νƒ€μž„ 였λ₯˜ (λ‹€μ–‘ν•œ 이유둜 앱이 μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ°œμƒ -> 앱이 꺼짐)
    • 미리 λ°œμƒκ°€λŠ₯ν•œ μ—λŸ¬λ₯Ό νŒŒμ•…, μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜λ©΄ μ•±μ˜ 꺼짐을 막을 수 있음
    • μ—λŸ¬μ²˜λ¦¬κ°€ ν•„μš”ν•œ 였λ₯˜

 

μ—λŸ¬μ²˜λ¦¬κ°€ ν•„μš”ν•œ 이유?
앱이 κ°‘μžκΈ° κΊΌμ§€λŠ” ν˜„μƒμ„ μ œμ–΄ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

 

μ—λŸ¬λŠ” 일반적으둜 ν•¨μˆ˜μ˜ 처리 κ³Όμ •μ—μ„œ 일어남 

문법?
func ν•¨μˆ˜λͺ… (νŒŒλΌλ―Έν„°) throws -> λ¦¬ν„΄νƒ€μž… {
}

μ—λŸ¬μ²˜λ¦¬ κ³Όμ •

  1. μ—λŸ¬λ₯Ό μ—΄κ±°ν˜•μœΌλ‘œ μ •μ˜ν•˜λ˜  , Error ν”„λ‘œν† μ½œ 채택해야함 (μŠ€μœ„ν”„νŠΈμ˜ μ—λŸ¬ ν”„λ‘œν† μ½œ 내에 톡합됨)
enum HeightError: Error {    
    case maxHeight
    case minHeight
}

   2. μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ•Όν•¨

func checkingHeight(height: Int) throws -> Bool {    // (μ—λŸ¬λ₯Ό 던잘수 μžˆλŠ” ν•¨μˆ˜ νƒ€μž…μ΄λ‹€)

    if height > 190 {
        throw HeightError.maxHeight
    } else if height < 130 {
        throw HeightError.minHeight
    } else {
        if height >= 160 {
            return true
        } else {
            return false
        }
    }
}

 

   3. μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆλŠ” ν•¨μˆ˜(== throwν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ ν•¨μˆ˜)λ₯Ό μ²˜λ¦¬ν•΄μ•Όν•¨ (ν•¨μˆ˜μ˜ μ‹€ν–‰)

  • tryν‚€μ›Œλ“œ
    • λͺ¨λ“  μ—λŸ¬λ°œμƒμ˜ μ˜ˆμ™Έμ μΈ 경우λ₯Ό λ””ν…ŒμΌν•˜κ²Œ 처리 κ°€λŠ₯ 
    •  do-catch
        • doλΈ”λŸ­ μ•ˆμ— μžˆλŠ” μ½”λ“œλŠ” 정상적인 경우의 처리λ₯Ό λ‹΄λ‹Ή
          • tryλŠ” doλΈ”λŸ­ μ•ˆμ— μž‘μ„±ν•œλ‹€. 
        • catchλΈ”λŸ­ μ•ˆμ— μžˆλŠ” μ½”λ“œλŠ” μ—λŸ¬μ˜ 경우의 처리λ₯Ό λ‹΄λ‹Ή
          • doλΈ”λŸ­μ—μ„œ λ°œμƒν•œ μ—λŸ¬λ§Œμ„ 처리
          • 1λ‹¨κ³„μ—μ„œ μ—΄κ±°ν˜•μœΌλ‘œ μ •μ˜λœ λͺ¨λ“  μ—λŸ¬λ₯Ό λ°˜λ“œμ‹œ μ²˜λ¦¬ν•΄μ•Όν•¨ (catch 뒀에 μ–΄λ– ν•œ 열거값도 μ—†λ‹€λ©΄ defaultκ°’μœΌλ‘œ 섀정됨 (μƒλž΅κ°€λŠ₯))
          • errorμƒμˆ˜λ₯Ό μ œκ³΅ν•¨(λͺ¨λ“  μ—λŸ¬κ°€ λ„˜μ–΄μ˜΄)
            • errorμƒμˆ˜(μ—λŸ¬ ν”„λ‘œν† μ½œ νƒ€μž…)λ₯Ό ꡬ체적으둜 μ •μ˜ν•œ νƒ€μž…μœΌλ‘œ μΊμŠ€νŒ…ν•΄μ„œ μŠ€μœ„μΉ˜λ¬Έ λ“±μœΌλ‘œ λ‹€μ‹œ 처리
do {                   // doλΈ”λŸ­ - ν•¨μˆ˜λ₯Ό ν†΅ν•œ 정상적인 처리의 경우 μ‹€ν–‰ν•˜λŠ” λΈ”λŸ­
    let isChecked = try checkingHeight(height: 200)
    print("놀이기ꡬ νƒ€λŠ” 것 κ°€λŠ₯: \(isChecked)")
    

catch {            // catchλΈ”λŸ­ - ν•¨μˆ˜κ°€ μ—λŸ¬λ₯Ό λ˜μ‘Œμ„ 경우의 처리 μ‹€ν–‰ν•˜λŠ” λΈ”λŸ­
    print("놀이기ꡬ νƒ€λŠ” 것 λΆˆκ°€λŠ₯")
}
  • try?ν‚€μ›Œλ“œ (Optional try)
    • μ˜΅μ…”λ„ νƒ€μž…μœΌλ‘œ 리턴 (정상적인 경우 : λ¦¬ν„΄νƒ€μž…μœΌλ‘œ 리턴, 비정상적인 경우 : nil 리턴) (μ˜΅μ…”λ„ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— unwrapping ν•„μš”)
  • try!ν‚€μ›Œλ“œ (Forced try) 
    • μ—λŸ¬κ°€ λ‚  수 μ—†λŠ” κ²½μš°μ—λ§Œ μ œν•œμ μœΌλ‘œ μ‚¬μš© κ°€λŠ₯(정상적인 경우 : λ¦¬ν„΄νƒ€μž…μœΌλ‘œ 리턴, 비정상적인 경우 : λŸ°νƒ€μž„μ—λŸ¬)

 

μ—λŸ¬λ₯Ό λ˜μ§€λŠ” ν•¨μˆ˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜

  • 일반적인 ν•¨μˆ˜λ‘œ μ—λŸ¬ λ‹€μ‹œ λ˜μ§€κΈ°
    • ν•¨μˆ˜ λ‚΄μ—μ„œ μ—λŸ¬λ₯Ό 직접 μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 경우, μ—λŸ¬λ₯Ό λ‹€μ‹œ 던질 μˆ˜λ„ 있음
    • catchλΈ”λŸ­μ΄ 없어도 μ—λŸ¬λ₯Ό λ°–μœΌλ‘œ 던질 수 있음
  • rethrowing ν•¨μˆ˜λ‘œ μ—λŸ¬ λ‹€μ‹œ λ˜μ§€κΈ° (rethrows ν‚€μ›Œλ“œ)
    • μ—λŸ¬λ₯Ό λ˜μ§€λŠ” throwing ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” 경우 , λ‚΄λΆ€μ—μ„œ λ‹€μ‹œ μ—λŸ¬ λ˜μ§€κΈ° κ°€λŠ₯ (rethrowsν‚€μ›Œλ“œ ν•„μš”)
    • λ©”μ„œλ“œμ™€ μƒμ„±μžλ„ ν•¨μˆ˜μ΄κΈ° λ•Œλ¬Έμ— rethrowsν‚€μ›Œλ“œ μ‚¬μš© κ°€λŠ₯
    • μ—λŸ¬λ₯Ό λ‹€μ‹œ 던짐 (직접 λ˜μ§€μ§€ λͺ»ν•¨)