스위프트 투어 - 에러 핸들링 Swift


에러 핸들링

에러 프로토콜을 차용하는 임의 형식을 사용해 에러를 나타낼 수 있다.

enum PrinterError: Error {
  case outOfPaper
  case noToner
  case onFire
}

throw 를 통해 에러를 던지고 throws 를 통해 함수가 에러를 던질 수 있음을 나타낸다. 만약 함수에서 에러를 던지면 함수는 즉시 반환되고 에러를 핸들하기 위한 함수 호출된 함수 코드로 간다.

func send(job: Int, toPrinter printerName: String) throws -> String {
  if (printerName == "Never Has Toner") {
    throw PrinterError.noToner
  }
  return "Job sent"
}

에러를 다루기위한 몇가지 방법이 있다. 한 방법은 do-catch 를 사용하는 것이다. 두 블럭내에서 try 를 씀으로서 에러를 던질 수 있는 코드임을 나타낸다. 캐치 블럭에서 에러는 다른 이름을 주지 않는한 주어진 이름 에러가 주어진다.

do {
  let printerResponse = try send(job:1040,toPrinter:"Bi Sheng")
  print(printerResponse)
} catch {
  print(error)
}

다중 캐치 블럭을 사용하여 에러를 다룰 수도 있다. 스위치에서 case 뒤에 패턴을 쓴다.

do {
  let printerResponse = try send(job: 1440, toPrinter: "Gutenberg")
  print(printerResponse)
} catch (PrinterError.onFire) {
  print("I'll just put this over here, with the rest of the fire.")
} catch (let printerError as PrinterError) {
  print("Printer error: \(printerError).")
} catch {
  print(error)
}

에러를 다루는 다른 방법은 try? 를 사용하여 결과를 옵셔널로 처리하는 것이다. 만약 함수가 에러를 던지면 지정한 에러는 디스카드되고 결과는 닐이된다. 달리말해, 결과는 함수에서 반환한 값을 포함하는 옵셔널이다.

let printerSuccess = try? send(job:1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job:1885, toPrinter:"Never Has Toner")

코드의 블럭을 작성하려면 defer 를 사용한다. 함수내의 모든 다른 코드가 실행된 후 반환 직전 에 실행되는 부분이다. 코드는 에러를 던지는지에 관계없이 실행된다. defer 를 사용해 설정하고 클린업하는 부분으로 사용할 수 있으며 다른 시간에 실행됨이 필요한 경우에도 쓰여질 수 있다.

var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]

func fridgeContains(_ food: String) -> Bool {
  fridgeIsOpen = true
  defer {
    fridgeIsOpen = false
  }
  let result = fridgeContent.contains(food)
  return result
}
fridgeContains("banana")
print(fridgeIsOpen)
// false

덧글

댓글 입력 영역