λ°μν
μλ¬ μ²λ¦¬ (ErrorHandling)
- νλ‘κ·Έλ¨ μ€ν μ μλ¬κ° λ°μνλ©΄ κ·Έ μν©μ λν΄ λμνκ³ , μ΄λ₯Ό 볡ꡬνλ κ³Όμ
- Swiftμμλ λ°νμ μλ¬κ° λ°μν κ²½μ° μ²λ¦¬λ₯Ό μν΄ μλ¬μ λ°μ(throw ing), κ°μ§(catching), μ ν(propagating), μ‘°μ(manipulating)μ μ§μνλ μΌκΈ ν΄λμ€λ₯Ό μ 곡
μλ¬μ νμμ λ°μ (Representing and Throwing Errors)
- Swiftμμ μλ¬λ Error νλ‘ν μ½μ λ°λ₯΄λ νμ μ κ°μΌλ‘ νν
- Error νλ‘ν μ½μ λΉμ΄μμΌλ©° μλ¬ μ²λ¦¬μ νμ μ μ¬μ©ν μ μμμ λνλ
enum ServerError: Error {
case forbidden
case notFound
case internalError
case unauthorized
// ...
}
μλ¬ μ²λ¦¬ λ°©λ²
- μλ¬κ° λ°μνμ λ, νΉμ μ½λ μμμ μλ¬λ₯Ό μ²λ¦¬ν΄μΌ νλ μ± μμ΄ μμ
- λ¬Έμ λ₯Ό μμ νκ±°λ, λ€λ₯Έ λμμ μλνκ±°λ, μ¬μ©μμκ² μ€ν¨λ₯Ό μλ €μΌ ν¨
- μλ¬κ° λ°μν ν¨μμμ λ°ν κ°μΌλ‘ μλ¬λ₯Ό λ°ννμ¬, ν΄λΉ ν¨μλ₯Ό νΈμΆν μ½λμμ μλ¬λ₯Ό μ²λ¦¬
- do-catch ꡬ문μ μ¬μ©
- μ΅μ λ κ°μ λ°ν
- assertλ₯Ό μ΄μ©νμ¬ κ°μ λ‘ ν¬λμ¬λ₯Ό λ°μ
ν¨μλ₯Ό μ¬μ©ν΄ μλ¬ μ ννκΈ°
- μ΄λ€ ν¨μ, λ©μλ νΉμ Initializerκ° μλ¬λ₯Ό λ°μμν¬ μ μλ€λ κ²μ μ리기 μν΄μ throw ν€μ
λλ₯Ό ν¨μ μ μΈλΆμ νλΌλ―Έν° λ€μ μμ± - throw ν€μλλ‘ νμλ ν¨μλ₯Ό ‘throwing function’μ΄λΌκ³ λΆλ¦
- λ§μ½ ν¨μκ° λ¦¬ν΄ κ°μ λͺ μνλ€λ©΄ throw ν€μλλ λ¦¬ν΄ κ° νμ κΈ°νΈμΈ νμ΄ν(->) μ μ μμ±
- throwing function μ κ·Έ ν¨μλ₯Ό νΈμΆν κ³³μΌλ‘ μλ¬λ₯Ό μ ν
func canThrowErrors() throws -> String
func cannotThrowErrors() -> String
do-catch ꡬ문 μ¬μ©ν μλ¬ μ²λ¦¬
- μ½λ λΈλ‘μμ μλ¬λ₯Ό μ²λ¦¬νκΈ° μν΄ do-catch ꡬ문μ μ¬μ©
- λ§μ½ do ꡬ문μμ μλ¬κ° λ°μνλ€λ©΄ μλ¬μ μ’ λ₯λ₯Ό catch ꡬ문μΌλ‘ ꡬλΆν΄ μ²λ¦¬ κ°λ₯
- μ΄λ€ μλ¬λ₯Ό μ΄ κ΅¬λ¬Έμ΄ μ²λ¦¬ν μ μλμ§ μ리기 μν΄ catch λ€μ ν¨ν΄μ μμ±
- λ§μ½ catchμ μ΄ ν¨ν΄μ κ°κ³ μμ§ μλ€λ©΄ λ°μνλ λͺ¨λ μλ¬λ₯Ό μ§μ μμμΈ errorλ‘ λ°μΈλ©
do {
try ννμ
κ²°κ³Ό
} catch ν¨ν΄ 1 {
μ²λ¦¬ κ²°κ³Ό
} catch ν¨ν΄ 2 where 쑰건 {
μ²λ¦¬ κ²°κ³Ό
} catch {
μ²λ¦¬ κ²°κ³Ό
}
μλ¬λ₯Ό μ΅μ λ κ°μΌλ‘ λ³ννκΈ°
- try? ν€μλλ₯Ό μ¬μ©νλ©΄ μλ¬λ₯Ό μ΅μ λ κ°μΌλ‘ λ³ννμ¬ μ²λ¦¬ κ°λ₯
- λ§μ½ try? λ€μ μλ μ½λμμ μλ¬κ° λ°μνλ€λ©΄, λ°ν κ°μ nil
func someThrowingFunction() throws -> Int {
// ...
}
let x = try? someThrowingFunction() // μλ¬κ° λ°μνλ©΄ xλ nilμ΄ λ©λλ€.
// xμ yλ λμΌν κ°μ κ°μ§ μ μμΌλ©°, λμΌν λμμ ν©λλ€.
let y: Int?
do {
y = try someThrowingFunction()
} catch {
y = nil
}
μλ¬ μ νλ₯Ό λΉνμ±ννκΈ°
- ν¨μλ λ©μλκ° μλ¬λ₯Ό λ°μμν€μ§ μμ κ²μ΄λΌ νμ νλ κ²½μ°, try! ν€μλλ₯Ό μ¬μ©
- μλ¬ μ νλ₯Ό λΉνμ±ννκ³ , μλ¬κ° λ°μνμ§ μλλ‘ runtime assertionμΌλ‘ νΈμΆμ λν
- μ€μ μλ¬κ° λ°μν μ λ°νμ μλ¬κ° λ°μ
μ 리 μμ μ§μ (Specifying Cleanup Actions)
- defer ꡬ문μ νμ¬ μ½λ λΈλ‘μ λκ°κΈ° μ μ κΌ μ€νλμ΄μΌ νλ μ½λλ₯Ό μμ±
- μ½λκ° λΈλ‘μ λΉ μ Έλκ°κΈ° μ μ κΌ λ§λ¬΄λ¦¬ν΄μΌ λλ μμ μ ν μ μκ² λμμ€
- defer ꡬ문μ μλ¬ μ²λ¦¬ μ΄μΈμ κ²½μ°μλ μ¬μ© κ°λ₯
- νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ«κ³ μλμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό λΉμ°κΈ° μν΄ deferλ¬Έμ μ¬μ© κ°λ₯
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file) // blockμ΄ λλκΈ° μ§μ μ μ€ν, μ£Όλ‘ μμ ν΄μ λ μ μ§μ μ¬μ©
}
while let line = try file.readline() {
// Work with the file.
}
// close(file) is called here, at the end of the scope.
}
}
λ°μν
'β¨οΈ Language > swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] ARC (0) | 2023.02.07 |
---|---|
[Swift] μ λ€λ¦ (Generic) (0) | 2023.02.07 |
[νλ‘κ·Έλλ¨Έμ€ LV.1] μλ°μλ°μλ°μλ°μλ°μ? (0) | 2023.02.07 |
[νλ‘κ·Έλλ¨Έμ€ LV.1] μμ μ°ΎκΈ° (0) | 2023.02.07 |
[Swift] κ³ μ°¨ν¨μ (0) | 2023.02.06 |