본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/SWIFT : GRAMMAR

Swift 기초 문법 - 예외 처리(Exception Handling)

 

 

 

 

예외 처리(Exception Handling)

 

 

 

목차 접기

예외 처리(Exception Handling)

발생한 오류 던지고 처리하기

 

 

💡 예외 처리(Exception Handling)

 

- 프로그램 실행 중 발생할 수 있는 예기치 않은 상황 또는 오류를 제어하는 메커니즘

  파일을 찾을 수 없음, 메모리 부족, 사용자의 잘못된 입력 등

- 예외 처리의 목적은 프로그램의 안정성을 유지하고 예외 상황이 발생했을 때 프로그램이 비정상적으로 종료되는 것을 방지하는 것

- 예외 상황을 구별하고 자체적으로 오류를 해결하거나, 사용자에게 어떤 에러가 발생했는지 알려주는 등에 대한 조치와 대응을 해야 함

- Swift에서는 런타임에 에러가 발생한 경우, 이를 처리를 지원하는 클래스 제공

 

 

 예외 처리 정의 

- Error 프로토콜을 채택하여 사용자 정의 에러를 사용할 수 있다.

 

 예시 

enum PhoneError: Error {
	case unknown
    case batteryLow(batteryLevel: Int)
}

 

 

 

 

 


 

 

try와 do-catch

- try 블록 안에서 예외가 발생할 수 있는 코드 실행

- 예외가 발생하면 실행이 중단되고, 해당 예외를 잡을 수 있는 catch 블록으로 이동

- catch 블록은 예외를 처리하고, 이후의 코드 실행을 계속할 수 있도록 함 

 

 

 기본 구문 

do {
    // 예외가 발생할 수 있는 코드
    try expression
} catch pattern {
    // 예외 처리
}

 

예시

파일을 열 때 발생한 예외

do {
    let fileContents = try String(contentsOfFile: "example.txt")
    print(fileContents)
} catch {
    print("파일을 열 수 없습니다: \(error)")
}

 

 

 

 

 


 

 

throw와 throws

- 함수나 메서드 내에서 오류를 발생시키는 데 사용

- 오류를 발생시키면 프로그램의 제어가 호출한 곳으로 전달되고, 해당 오류를 처리할 수 있는 catch 블록이 있는 곳으로 이동

- 예외 상황이 발생했을 때 특정 오류를 던지기 위해 사용됨

 

 기본 구문 

func fetchDataFromServer() throws {
    // 함수 내부 로직
    if errorCondition {
        throw NetworkError.connectionError
    }
}

 

예시

간단한 오류 처리

enum CalculationError: Error {
    case divisionByZero
}

func divide(_ dividend: Int, by divisor: Int) throws -> Int {
    guard divisor != 0 else {
        throw CalculationError.divisionByZero
    }
    
    return dividend / divisor
}

 

 

 

 

 


 

 

💡 발생한 오류 던지고 처리하기

 

 

 throw와 throws : 발생한 오류 던지기 

※ 오류를 던진다 ▶ 오류를 처리해 주는 곳으로 전달해 준다

 

throws : 오류가 발생할 가능성이 있는 메소드 옆에 작성

func printNumber(_ number: Int) throws {} // void의 경우
func printNumber(_ number: Int) throws -> Int {} // 리턴타입의 경우

 

throw : 오류가 발생할 구간에 작성

func printNumber(_ number: Int) throws -> Bool {
    let text = "숫자출력"
    guard number > 0 else {
        throw HttpError.badRequest
    }
    print("\(text): \(number)")
    return true
}

 

 

예시

enum HttpError: Error {
    case badRequest
    case unauthorized
    case forbidden
    case notFound(_ errorPrint: String)
    case requestTimeOut
    case conflict
}

 

위 변수를 받는 케이스가 있다면 에러와 함께 값(String)을 넘겨줄 수 있음

   → 꼭 String이 아니어도 됨, 넘겨주고 싶은 값을 넘겨주면 됨

func printNumber(_ number: Int) throws -> Bool {
    let text = "숫자출력"
    guard number > 0 else {
        throw HttpError.notFound("찾을 수가 없습니다.")
    }
    print("\(text): \(number)")
    return true
}

 

 

 

 try와 do-catch : 던진 오류 처리하기 

※ throw로 예외를 던져주었다면 오류를 처리할 때에는 try와 do-catch로 처리할 수 있음

 

enum NetworkError: Error {
    case connectionError
    case timeoutError
    case serverError
}

func fetchDataFromServer() throws {
    let randomNumber = Int.random(in: 1...3)
    
    // 예시를 위해 임의로 오류 발생
    switch randomNumber {
    case 1:
        throw NetworkError.connectionError
    case 2:
        throw NetworkError.timeoutError
    default:
        throw NetworkError.serverError
    }
}

do {
    try fetchDataFromServer()
    print("데이터를 성공적으로 가져왔습니다.")
} catch NetworkError.connectionError {
    print("네트워크 연결 오류입니다.")
} catch NetworkError.timeoutError {
    print("요청 시간이 초과되었습니다.")
} catch NetworkError.serverError {
    print("서버에서 오류가 발생했습니다.")
} catch {
    print("다른 오류가 발생했습니다: \(error)")
}

 

- 위 예시에서 fetchDataFromServer 함수를 호출하고 있음

   → 이 함수는 임의의 오류를 발생시키며 발생한 오류에 따라 다른 예외가 처리된다.

 

- fetchDataFromServer 함수는 throws 키워드를 사용하여 함수가 오류를 던질 수 있음을 나타내고 있음

   → 따라서 이 함수를 호출할 때에는 try 키워드를 사용해야 한다.

 

- do-catch 구문 내에서 try 블록 내에서 예외가 발생할 수 있는 코드를 실행하고 있음

   → 만약 예외가 발생 시 해당 catch 블록이 실행되며, 각 catch 블록은 발생한 특정 오류에 대한 예외 처리를 담당함

 

- 마지막 catch 블록은 모든 다른 오류에 대한 처리를 담당함

 

 

 

 

참고

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31