Swift 기초문법 - 17. 에러

정성윤·2023년 7월 17일
0

Swift 이론

목록 보기
19/64

예외처리

  • 우리가 원하지 않는 케이스
  • 정상적으로 돌아가지 않는 결과물

< 에러가 생길 수 있는 예제 코드 >

totalNumber / inputNumber

0으로 나눌 수 없습니다. -> 에러를 처리해줘야합니다.
if 문으로 해결

if inputNumber != 0 {
throw totalNumber / inputNumber
}
do {
	try devideByinputNumber(input)
}catch{
	print(error)
{

예외를 던져주는 throw 받아주는 catch를 사용합니다.

  • 시험삼아 해볼 do
  • 에러 받기 catch
  • 에러 던지기 throw error
do{
	try code
}catch{
	catch error
}

Swift에서는 컴파일러와 런타임 중 발생하는 여러 가지 종류의 에러를 다룰 수 있습니다.
코드 작성 시점에서 발견되는 컴파일 에러와 프로그램 실행 중 발생하는 런타임 에러로 구분 됩니다.

컴파일 타임 에러(Compile-time Errors)

  • 문법 에러 : 코드가 올바른 Swift 문법을 따르지 않을 때 발생합니다. 이러한 에러는 컴파일하는 동안 발생하며, 컴파일러는 에러 메시지와 함게 해당 줄 및 위치를 알려줍니다.

  • 타입 에러 : 변수나 함수 등의 타입이 일치하지 않거나 타입 변환에 문제가 있을 때 발생합니다.

런타임 에러 (Runtime Errors)

  • 강제 언래핑 에러 : 옵셔널 변수나 옵쳐널 체인이 nil 값을 가리키고 있는 상태에서 강제 언래핑('!')을 시도할 때 발생합니다. 이는 nil 값을 언래핑하여 접근하려 할 때 발생하는 에러로, 런타임 중에 프로그램이 비정상적으로 종료됩니다.

  • 배열 인덱스 초과 에러 : 배열의 인덱스 범위를 초과하여 접근하려고 할 때 발생합니다.

  • nil 값 처리 에러 : 옵셔널 타입의 변수를 제대로 처리하지 않고 nil 값을 사용하려 할 때 발생합니다. nil 값인 옵셔널 변수에 접근하면 에러가 발생합니다.

  • 기타 런타임 에러 : 0으로 나누기, 잘못된 형변환, 잘못된 API 사용 등 여러 가지 상황에서 런타임 에러가 발생할 수 있습니다. 이러한 에러는 프로그램이 실행되는 동안 발생하며, 예외 처리 등의 방법으로 처리할 수 있습니다.

에러 띄우기

  1. throw 를 사용하여 에러 띄우기
    • 에러를 나타내기 위해 'Error'프로토콜을 준수하는 자신만의 에러 유형을 정의합니다.
    • 함수나 메서드 내에서 'throw' 키워드를 사용하여 에러를 던집니다.
    • 'try' 키워드를 사용하여 에러가 발생할 수 있는 코드 블록을 호출하고, 'catch' 블록에서 에러를 처리합니다.
enum CustomError: Error {
    case someError
}
func processValue(_ value: Int) throws {
    if value < 0 {
        throw CustomError.someError
    }
    // 에러가 발생하지 않으면 정상적으로 처리합니다.
    print("Value is positive.")
}
do {
    try processValue(-1)
} catch {
    print("An error occurred: \(error)")
}

던져진 에러를 받고싶지 않을때 = nil

try? CustomError.someError
처럼 ?로 처리를 할수 있습니다

try! CustomError.someError
!로 처리를 할 경우 에러가 무조건 없을 것이다.라는 뜻입니다. > 에러가 있을 경우 에러 발생

  • 반환하는 메소드, 에러를 같이 내뱉고 싶을때


  1. assert 를 사용하여 조건 확인하기
    • 'assert' 함수를 사용하여 특정 조건이 만족되지 않으면 에러를 발생시킵니다.
    • 디버그 모드에서만 동작하며, 릴리스 모드에서는 무시됩니다.
func divide(_ dividend: Int, by divisor: Int) -> Int {
    assert(divisor != 0, "Divisor cannot be zero.")
    return dividend / divisor
}
let result = divide(10, by: 0) // Assertion failed: Divisor cannot be zero.

참고(출처) : 개발하는 정대리, 야곰(Swift 5)

profile
이유있는 스위프트 개발자

1개의 댓글

comment-user-thumbnail
2023년 7월 17일

저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!

답글 달기