본문 바로가기
IOS App Programming/Swift

[Swift] 오류처리 - throws, do-catch, try

by B_Tori 2023. 4. 12.

오류와 오류 처리

오류처리란 프로그램이 오류를 일으켰을 때 이것을 감지하고 회복시키는 일련의 과정이다.

오류 표현

  • Error라는 프로토콜을 준수하는 타입의 값을 통해 표현한다.
  • 사실상 Error프로토콜은 요구사항이 없는 프로토콜이지만, 오류를 표현하기 위해 Error프로토콜을 채택한다.
    -> Error프로토콜을 채택함으로써 해당 타입이 오류 처리를 위한 타입임을 알 수 있음
  • 오류를 나타내기 위한 타입으로 주로 열거형을 사용함
enum MyError:Error{
    case error1
    case error2
    case error3
}

error프로토콜을 준수한 열거형을 하나 선언한 후 나올 수 있는 에러 유형별로 case를 나누어 작성해 준다.

 

오류 처리 과정

  1. 오류 종류를 미리 예상해 오류를 표현함
  2. 오류 발생 여지가 있는 곳에서 오류를 던짐(throw)
  3. 던저진 오류를 처리함 
    1. do-catch문
    2. 옵셔널 값 처리
    3. 강제 처리 (오류 발생하지 않음을 확신하고 처리)

 

오류 던지기(throws)

  • 함수, 메서드, 이니셜라이저 등의 매개변수 뒤에 throws키워드를 작성하면 해당 func은 오류를 던질 수 있다.
    ex) func canThrowErrors() throws -> String
  • throws키워드를 명시한 함수 안에서 오류를 던지는 부분에서 throw키워드를 사용하여 오류를 던짐
  • guard문을 사용해 빠른 종료를 함
func canThrowErrors() throws -> String{
    ...
    //오류 던지는 부분
    guard 조건 else {
    	throw MyError.error1
        return
    }
    ...
}

해당 함수에서 조건에 맞지 않으면 error1 오류를 던지고 함수를 종료시킨다.

이제 던져진 오류를 받아 적절한 방법을 사용하여 처리해주기만 하면 된다.

 

오류 처리하기

오류를 포함하는 함수를 실행할 때 try를 사용한다. 즉 try로 던져진 오류를 받아 처리한다.

do - catch 구문

do{
    try canThrowError() //오류 발생 가능 코드
    오류 발생 안할 시 실행할 코드
}catch error1{
    error1발생 시 처리 코드
}catch error2{
    error2발생 시 처리 코드
}


// switch문과 함께 사용
do {
    try ...
}catch{
	switch error {
    	case error1
        case error2
    }
}

do 구문 안에 try 오류 발생 가능 코드를 써주고 밑에는 오류가 아닐 시 실행 할 코드를 적어준다.

catch문을 통해 오류 타입별 처리 코드를 적어준다.

catch문을 하나로 묶어 안에 switch문과 같이 사용하여 오류를 처리할 수 있다.

catch문에서 오류 전달인자를 따로 지정하지 않으면 암묵적으로 error라는 변수명으로 오류가 들어온다. 따라서 switch문에서 따로 error라는 변수를 선언하지 않았음에도 위처럼 사용할 수 있게 된다.

 

옵셔널 값으로 오류 처리

  • try? 문을 사용하면 동작 코드가 오류를 던지면 nil을 반환하고 오류가 발생하지 않으면 결괏값을 옵셔널로 반환한다.
  • 예를 들어 오류를 던지는 A함수가 존재하고 A의 반환타입이 String일 경우 try? A() 시
    - 오류 발생 : nil 반환
    - 오류 발생 X : Optional <String> 타입의 함수 실행 결과 값을 반환

강제 처리 (오류가 발생하지 않는다고 확신하는 경우)

  • try! 문을 사용한다.
  • 이는 오류를 발생하지 않는다고 확신하는 경우 사용하며, 만약 오류가 발생하는 경우 런타임 오류가 발생한다.

댓글