Error Handling

Minseong·2022년 2월 18일
0

swift

목록 보기
1/10

Error Handling

  • 프로그램이 실행되는 동안 발생한 에러를 처리하기위해 에러 처리 (error handling)를 사용
  • 에러 처리 (Error handling) 는 프로그램의 에러 조건에서 응답하고 복구하는 프로세스

미리보기

func canThrowAnError() throws {
	// 이 함수는 오류를 발생시키거나 발생시키지 않을 수 있다.
}
  • 함수 선언시 throws 키워드를 포함시켜 에러가 발생할 수 있음을 표시
  • 에러를 발생할 수 있는 함수를 호출할 때는 표현식 앞에 try 키워드를 붙여야 함

    throws가 던지고 try가 받고

do {
try canThrowAnError()
// no error was thrown
} catch {
// an error was thrown
}
  • catch 절에 의해 처리될 때까지 현재 범위에서 에러를 자동으로 전파
  • canThrowAnError함수에서 에러가 발생되지 않으면 다음 문장으로 넘어감
  • 오류 발생시 catch절로 오류를 전파

Optional 과 Error Handling의 차이

  • Optional : 값의 존재 유무를 사용하여 함수의 성공 또는 실패를 전달
  • Error Handling : 에러 원인을 판별하고 필요한 경우 에러를 프로그램의 다른 부분으로 전파 할 수 있음

    결론!
    옵셔널은 한가지의 경우에 대해서만 처리를 하지만 에러처리는 여러 경우의 수와 그에 따른 에러를 처리할 수 있다!

Representing and Throwing Errors

  • 에러표현
// 게임 내에서 자동 판매기를 작동하는 에러 조건을 나타내는 방법
enum VendingMachineError: Error {
	case invalidSelection
	case insufficientFunds(coinsNeeded: Int)
	case outOfStock
}
  • Throwing Error
throw VendingMachineError.insufficientFunds(coinsNeeded: 5)
// 자동 판매기에 5개의 코인이 더 필요하다고 에러를 발생 시킴
// 에러가 발생하면 정상적인 흐름을 계속할 수 없음을 나타낸다 "이런 오류 났어!"

Handling Error

에러를 처리하는 4가지 방법
1. 함수에서 해당 함수를 호출하는 코드로 에러를 전파하는 방법
2. do-catch 구문을 사용하는 방법
3. 옵셔널 값으로 에러를 처리하는 방법
4. 에러가 발생하지 않을 것이라고 주장하는 방법

  • Swift에서 에러 처리는 프로세스 인 호출 스택 해제가 포함되지 않는다.
  • throw 구문의 성능 특성은 return 구문의 성능 특성과 비슷

Propagating Errors

  • 에러를 전파하는 방법!
func canThrowErrors() throws -> String
  • 함수, 메서드 또는 이니셜라이저에서 오류가 발생할 수 있음을 나타내려면 함수의 선언에 throws 키워드를 작성

    주의!
    throws 함수는 에러를 전파만 할 수 있기 때문에 throws 선언이 되지 않은 함수 내에서 발생된 모든 에러는 함수 내에서 처리되어야 함!

Handling Errors Using Do-Catch

  • 에러가 do 절에서 발생되면 catch 절과 비교하여 에러를 처리할 수 있는 항목을 결정
  • 에러가 무엇인지 나타내기 위해 catch 뒤에 패턴을 작성
  • catch 절이 패턴을 가지고 있지 않다면 이 절은 모든 에러와 일치하고 error 라는 이름을 가진 지역 상수로 에러를 바인드
do {
	try expression
	statments
} catch pattern 1 {
	statments
} catch pattern 2 {
	statements
} catch {
	statements
}
  • catch 절은 do 절에서 발생할 수 있는 모든 에러를 처리할 필요는 없다.
  • catch 절이 에러를 처리하지 않으면 에러는 주변에 전파. 그러나 전파된 에러는 일부 주변 범위에서 처리되어야 한다.
  • throw 함수에서는 do-catch 구문이나 호출자가 에러를 처리해야 함. 에러가 처리되지 않고 범위의 최상위로 전파되면 런타임 에러를 발생

Converting Errors to Optional Values

  • 에러를 옵셔널 값으로 변환하여 처리하기 위해 try? 를 사용
  • try? 구문에서 에러가 발생되면 이 표현식의 값은 nil
func someThrowingFunction() throws -> Int {
    // ...
}
let x = try? someThrowingFunction()
// x = nil

Disabling Error Propagation

  • 함수 또는 메서드가 실제로 런타임 에러를 발생하지 않는다는 사실을 알고 있을 경우 에러 전파를 비활성화 하기 위해 try! 를 작성할 수 있다.
  • 에러가 발생한다면 런타임 에러가 발생

Specifying Cleanup Actions

  • 정리 작업 지정
  • defer 구문을 사용하면 코드의 현재 블럭이 종료되기 직전에 일련의 구문을 실행
  • 이 구문을 사용하여 에러가 발생하여 종료되거나 return 또는 break 와 같은
    구문에 의해 종료되는 방식에 상관없이 필요한 정리를 수행할 수 있다.
  • defer 구문은 현재 범위가 종료될 때까지 실행을 연기

    지연된 구문은 break 또는 return 구문과 같이 구문의 밖으로 제어를 이동하거나 에러를 발생시키는 코드를 포함할 수 없음

func testDefer() {
    print("1")
    defer { print("defer 1") }
    print("2")
}
// 1 - 2 - defer 1
func testDefer() {
    defer { print(1) }
    defer { print(2) }
    defer { print(3) }
}
// 3 - 2 - 1
  • 지연된 동작은 소스 코드에 작성된 순서와 반대로 실행
profile
안녕하세요! ios 공부 중인 초보 개발자입니다!

0개의 댓글

관련 채용 정보