Swift

Swift) Error Handling(오류 처리)를 알아보자

Sonny Cucumber 2024. 1. 31. 17:08


안녕하세요 :)

바로 시작해보겠습니다 

 

개발에 있어서, 오류 처리는 아주 아주 중요한 부분임!!

 

안정성을 위해서도 사용자 경험에 있어서도

중요한 부분이기 때문에

예상치 못한 오류를 막기 위해 꼭 알아야함!

 

 

아래와 같은 PrintError라는 열거형을 예로 들면

enum PrinterError: Error {
    case outOfPaper
    case noToner
    case onFire
}

 

아래 코드의 메소드 send 안에서

에러를 처리해주려면

 

에러가 발생할 가능성이 있는 메소드의 제목 옆에 throws를 써준 후

오류가 발생하는 구간에 throw를 써주면 된다.

 

여기서 throws 키워드는 오류를 던질 수 있음을 나타내고

throw 키워드를 사용해서 오류를 던짐

 

func send(job: Int, toPrinter printerName: String) throws -> String {
    if printerName == "Never Has Toner" {
        throw PrinterError.noToner
    }
    return "Job sent"
}

 

이외에도 에러를 다루는 방법은 몇가지가 더 있는데

 

do-catch 키워드로 에러를 처리할 수 있음

do {
    let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
    print(printerResponse)
} catch {
    print(error)
}

 

이렇게 do 블록 안에 오류가

발생할 수 있는 코드를 작성하고

 

에러가 발생할 시 

catch 안의 중괄호로 보내

오류를 처리한다.

 

try 키워드는 에러가 발생할 수 있지만

한번 트라이 해볼께 라는 의미이고

 

만약 오류가 발생하면 catch 블록으로 전달된다.

 

에러가 특정하게 여러가지로 나뉜다 싶으면

catch를 두번 이상 써주는 것도 가능하다. 

 

그럼 개별적으로 오류를 처리하는데

switch 키워드 문과 유사하다고 보면된다.

 

아래는 예시

do {
    let printerResponse = try send(job: 1440, toPrinter: "Gutenberg")
    print(printerResponse)
} catch PrinterError.onFire {
    print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
    print("Printer error: \(printerError).")
} catch {
    print(error)
}

 

 

이외에도 모든 코드가 실행된 후에

작동하게 하는 키워드가 있는데

 

바로 defer 키워드다.

 

이 키워드 안에 있는 코드는

에러가 발생하는 것에 상관없이

작동하게 된다. 

var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]

func fridgeContains(_ food: String) -> Bool {
    fridgeIsOpen = true
    defer {
        fridgeIsOpen = false
    }

    let result = fridgeContent.contains(food)
    return result
}
fridgeContains("banana")
print(fridgeIsOpen)

//false가 프린트 됨