Swift 3.0異常エラーの処理

2134 ワード

OCでは,セルテスト時に断言を用い,断言中の条件が満たされると異常が発生し,対応する断言エラーが印刷される.Swiftでは異常の処理や投げ出しも他の言語のように処理できます.
//           ,       Error  ,       ,   ,   
enum CarError: Error{
case lackOil
case overload
}
//         
enum Driver {
case start//    
case loading//    
}
//   ,    ,
//     ,  10%       。
//     ,  2000     
class  Car {
var minOil: Double = 0.1
var maxCargo: Double = 2000.0// kg
//throws           ,       do  
func drivering(driver: Driver)throws {//  
    switch driver {
    case .start:
        //guard else      if else   ,   guard               ,        else      
        guard self.minOil > 1.0 else {
            throw CarError.lackOil //                , catch       
        }
        print("the car begin move")
    case .loading:
        guard  self.maxCargo < 2000 else {
            throw CarError.overload
        }
        print("the car begin working")
    }
}

//              ,
func workingCar(car: Car)throws {
    //defer                       。        
    defer {
        print(" always run")
    }
    // do catch   do              , catch             ,  do        throws       ,              
    // try!   try!                       ,    。      
    //try   try             ,    try?             ,         Optional,     nil
    
    do {
        //               ,             
        try car.drivering(driver: .loading)
        try car.drivering(driver: .start)
    } catch let CarError.lackOil {
        //      
        print("  lack of oil ")
    } catch let CarError.overload {
        print("   overLoad ")
    }
}

//        
let car = Car.init(oil: 0.5, cargo: 3000)
do {
try workingCar(car: car)
} catch  {
}

印刷されます:the car begin move**overLoad**will will**
//     
let car = Car.init(oil: 0.05, cargo: 1500)
do {
try workingCar(car: car)
} catch  {
}

印刷:**lack of oil**will will**油が不足しているため、油量が足りない異常を放出した後、後の重量超過方法は実行されていませんが、will willは依然として実行されます.実はOCの中の異常処理は自分で処理したことがありません.本当に理解しにくいです.普通は直接印刷しても構いません.そして、errorがnilを伝えるのが一般的です.OCに関する異常処理を見たいなら、このNSErrorを見てください.http://nshipster.com/nserror/.