[swift] 앱 가동 중에 발생하는 예외 상황 처리하기

스위프트(Swift)로 개발된 앱을 실행할 때, 가끔 예외 상황이 발생할 수 있습니다. 이러한 예외 상황에 대응하여 적절한 처리를 해주어야 합니다. 이번 블로그 게시물에서는 스위프트에서 앱 가동 중에 발생하는 예외 상황을 처리하는 방법에 대해 알아보겠습니다.

1. do-catch 문을 사용한 예외 처리

스위프트에서 예외 처리는 do-catch 문을 통해 수행됩니다. do 블록에는 예외가 발생할 수 있는 코드를 작성하고, catch 블록에는 예외 상황을 처리하는 코드를 작성합니다. 예외가 발생하지 않았을 경우 catch 블록은 실행되지 않습니다.

do {
    // 예외가 발생할 수 있는 코드
} catch let error {
    // 예외 상황 처리 코드
}

예를 들어, 파일을 열고 읽는 과정에서 예외가 발생할 수 있다면, 다음과 같이 예외 상황을 처리할 수 있습니다.

do {
    let fileData = try readFile()
    processFileData(fileData)
} catch let error {
    print("파일을 읽는 도중 예외가 발생했습니다: \(error)")
}

2. 예외 타입별 처리

스위프트에서는 예외 타입에 따라서 다른 처리를 할 수 있습니다. catch 블록을 여러 개 작성하여 예외 타입별로 처리 방법을 지정할 수 있습니다.

do {
    // 예외가 발생할 수 있는 코드
} catch let error as ErrorType {
    // ErrorType에 대한 처리 코드
} catch let exception as ExceptionType {
    // ExceptionType에 대한 처리 코드
}

예를 들어, 네트워크 통신 중에 발생하는 예외들을 다른 방식으로 처리하고 싶다면, 다음과 같은 코드를 작성할 수 있습니다.

do {
    try sendRequest()
} catch let error as NetworkError {
    print("네트워크 오류: \(error)")
    retryRequest()
} catch let error {
    print("알 수 없는 오류 발생: \(error)")
    showErrorAlert()
}

위 예제에서 NetworkError 타입의 예외가 발생했을 경우 해당 오류에 대한 처리를 하고, 그 외 다른 예외 타입들에 대해서는 일반적인 오류 처리를 수행하도록 구현되어 있습니다.

3. defer 문을 사용한 정리 작업

스위프트에서는 defer 문을 사용하여 예외가 발생하더라도 정리 작업을 수행할 수 있습니다. defer 블록 안에 작성된 코드들은 현재 스코프가 종료되기 직전에 실행됩니다. 예를 들어, 파일을 열고 처리한 후 항상 파일을 닫아야 하는 경우 다음과 같이 defer 문을 사용할 수 있습니다.

func processFile() {
    let file = openFile()
    defer {
        closeFile(file)
    }
    
    // 파일 처리 코드
}

위 예제에서 openFile() 함수로 파일을 열고, defer 블록 안에 있는 closeFile(_:) 함수를 통해 파일을 닫습니다. 이렇게 하면 예외가 발생하더라도 항상 파일이 닫히도록 보장할 수 있습니다.

4. 중첩된 do-catch 문을 사용한 예외 처리

복잡한 예외 상황이 발생하는 경우, 중첩된 do-catch 문을 사용하여 예외를 처리할 수 있습니다. 이렇게 함으로써 예외의 범위를 명확하게 지정하고, 각 예외에 대한 분리된 처리를 수행할 수 있게 됩니다.

do {
    try doSomething()
    try doAnotherThing()
} catch let error {
    print("처리되지 않은 예외 발생: \(error)")
    
    do {
        try rollbackOperation()
    } catch let rollbackError {
        print("롤백 도중 예외 발생: \(rollbackError)")
    }
}

위 예제에서 doSomething()doAnotherThing()이라는 함수들이 예외를 발생시킬 수 있습니다. 첫 번째 catch 블록에서는 예외 상황을 처리하고, 중첩된 do-catch 문에서 롤백 작업 처리 중 발생하는 예외도 별도로 처리할 수 있습니다.

앱 개발을 할 때 예외 상황에 대비하여 적절한 예외 처리를 구현하는 것이 중요합니다. 스위프트에서는 do-catch 문을 사용하여 예외를 처리할 수 있으며, 예외 타입별로 다른 처리 방법을 적용할 수 있습니다. 또한 defer 문을 사용하여 정리 작업을 할 수 있으며, 중첩된 do-catch 문을 사용하여 복잡한 예외 상황에 대응할 수 있습니다.

이상으로 앱 가동 중에 발생하는 예외 상황 처리에 대해 알아보았습니다. 추가적인 정보를 얻고 싶다면, 스위프트 공식 문서를 참고해보세요.