Swift Basic -14(오류 처리)
Swift에서 오류는 Error 프로토콜 유형의 값으로 표시됩니다.이 빈 프로토콜은 이 형식이 오류 처리에 사용할 수 있음을 보여 줍니다.Swift의 매거 유형은 관련 오류 상태를 구축하는 데 특히 적합하며, 매거의 관련 값은 오류 상태에 대한 추가 정보를 제공할 수 있습니다.
enum VendingMachineError : Error {
case invalidSelection //
case insufficientFunds(coinsNeeded: Int) //
case outOfStock //
}
2. 오류 처리
어떤 오류가 던져졌을 때, 부근의 일부 코드는 반드시 이 오류를 처리해야 한다. 예를 들어 이 문제를 바로잡거나, 다른 방식을 시도하거나, 사용자에게 오류를 보고해야 한다.Swift에는 4가지 오류 처리 방법이 있습니다.이 함수를 호출하는 코드에 함수를 던지거나do-catch 문장으로 오류를 처리하거나, 선택할 수 있는 형식으로 오류를 처리하거나, 이 오류가 발생하지 않을 것이라고 단언할 수 있습니다.
Swift의 오류 처리는 다른 언어에서try,catch,throw로 이상 처리를 하는 것과 비슷합니다.다른 언어 (Objective-C 포함) 의 이상 처리와 달리 Swift의 오류 처리는 호출 창고 해제와 관련이 없으며, 이것은 계산 대가가 높은 과정이다.따라서throw문장의 성능 특성은return문장과 필적할 수 있다.
throws
키워드를 추가합니다.throws
키워드가 표시된 함수를 throwing
함수라고 부른다.이 함수가 반환값 유형을 가리키면 throws
키워드는 화살표 (->) 앞에 써야 합니다.func canThrowErrors() throws -> String
func cannotThrowErrors() -> String
throwing 함수만 오류를 전달할 수 있음을 주의하십시오.어떤 비throwing 함수 내부에서 던진 오류는 함수 내부에서만 처리할 수 있습니다.
struct Item {
var price: Int
var count: Int
}
class VendingMachine {
var inventory = [
"Candy Bar": Item(price: 12, count: 7),
"Chips": Item(price: 10, count: 4),
"Pretzels": Item(price: 7, count: 11)
]
var coinsDeposited = 0
func dispenseSnack(snack: String) {
print("Dispensing \(snack)")
}
func vend(itemNamed name: String) throws {
guard let item = inventory[name] else {
throw VendingMachineError.InvalidSelection
}
guard item.count > 0 else {
throw VendingMachineError.OutOfStock
}
guard item.price <= coinsDeposited else {
throw VendingMachineError.InsufficientFunds(coinsNeeded: item.price - coinsDeposited)
}
coinsDeposited -= item.price
var newItem = item
newItem.count -= 1
inventory[name] = newItem
print("Dispensing \(name)")
}
}
vend(itemNamed:) 방법의 실현에서guard문구를 사용하여 조기 퇴출 방법을 사용하여 어떤 물품을 구매하는 데 필요한 조건 중 어느 조건이 충족되지 않을 때 미리 퇴출 방법을 사용하고 해당하는 오류를 던질 수 있도록 합니다.throw 문장은 즉시 방법을 종료하기 때문에 물품은 모든 조건이 충족될 때만 판매됩니다.
do {
try expression
statements
} catch pattern 1 {
statements
} catch pattern 2 where condition {
statements
}
자세는 다음과 같습니다.
var vendingMachine = VendingMachine()
vendingMachine.coinsDeposited = 8
do {
try buyFavoriteSnack("Alice", vendingMachine: vendingMachine)
} catch VendingMachineError.InvalidSelection {
print("Invalid Selection.")
} catch VendingMachineError.OutOfStock {
print("Out of Stock.")
} catch VendingMachineError.InsufficientFunds(let coinsNeeded) {
print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")
}
// “Insufficient funds. Please insert an additional 2 coins.”
buyFavoriteSnack(person:vendingMachine:)
함수는 오류를 던질 수 있기 때문에 try
표현식에서 호출됩니다.오류가 던져지면 그에 상응하는 집행은 즉시 catch
자구로 옮겨져 이 오류가 계속 전달될지 판단한다.오류가 없으면 do
자구에 남은 문장이 실행됩니다.func someThrowingFunction() throws -> Int {
}
let x = try? someThrowingFunction()
let y: Int?
do {
y = try someThrowingFunction()
} catch {
y = nil
}
someThrowingFunction()
오류가 발생하면 x와 y의 값은 nil
입니다.그렇지 않으면 x와 y의 값이 이 함수의 반환값입니다.someThrowingFunction()
의 반환값 유형이 어떤 유형이든지 간에 x
및 y
은 이 유형의 선택 가능한 유형입니다.예에서 이 함수는 정형으로 되돌아오기 때문에 x와 y는
이다.func contents(of filePath:String) throws -> String{
let file = open(filePath,O_RDWR)
defer {
close(file)
}
//...
}
defer에 관해서는 여러 defer가 역순으로 실행되는 것을 주의해야 한다.프로그램이 심각한 오류를 만났을 때, 예를 들어fatalError, 또는 nil, 또는segfaults를 강제로 해석할 때, defer의 코드 블록은 실행되지 않습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.