12/08/2018, 16:35

Error Handling trong Swift

Error handling is the process of responding to and recovering from error conditions in your program. Swift provides first-class support for throwing, catching, propagating, and manipulating recoverable errors at runtime. Tạm dịch là: Error Handling là tiến trình phản hồi và khôi phục từ các ...

Error handling is the process of responding to and recovering from error conditions in your program. Swift provides first-class support for throwing, catching, propagating, and manipulating recoverable errors at runtime.

Tạm dịch là: Error Handling là tiến trình phản hồi và khôi phục từ các điều kiện lỗi trong chương trình của bạn. Swift cung cấp first-class để hỗ trợ throwing, catching, propagating và manipulating recoverable lỗi trong thời gian chạy.

Một vài hoạt động không được đảm bảo rằng luôn luôn thành công hoặc không cho ra được kết quả hợp lý. Optionals được sử dụng để thể hiện việc biến không có giá trị, nhưng khi một số xử lý thất bại, nó cần phải biết nguyên nhân thất bại là gì, để code của bạn có thể có những xử lý tiếp theo cho phù hợp. Như ví dụ, xem xét nhiệm vụ đọc và xử lý dữ liệu từ tập tin trên ổ đĩa. Nhiệm vụ này có thể bị lỗi, như tập tin không tồn tại, tập tin không có quyền đọc hoặc tập tin không có định dạng phù hợp. Theo những trường hợp khác, cho phép một chương trình giải quyết lỗi và thông báo với người dùng bất kỳ lỗi nào mà nó có thể giải quyết.

Trong Swift, lỗi được đại diện bởi giá trị của những kiểu tuân theo protocol ErrorType. Protocol này cho thấy rằng một kiểu có thể được sử dụng để xử lý lỗi. Những kiểu liệt kê (Enum) trong Swift phù hợp nhất để mô hình một nhóm liên quan điều kiện lỗi, giá trị được liên kết cho phép bổ sung thông tin chi tiết của một lỗi. Ví dụ đây là 1 cách xử lý lỗi trong game:

enum VendingMachineError: Error {
    case invalidSelection
    case insufficientFunds(coinsNeeded: Int)
    case outOfStock
}

Throw lỗi cho phép bạn chỉ ra rằng có điều gì đó hoạt động sai đã xảy ra và tiến trình đang thực hiện không thể tiếp tục. Bạn sử dụng throw để thông báo 1 lỗi đã xảy ra. Ví dụ, mã sau đây phát ra một lỗi để cho biết rằng năm đồng tiền bổ sung là cần thiết của máy bán hàng tự động:

throw VendingMachineError.insufficientFunds(coinsNeeded: 5)

Khi một lỗi phát sinh, một vài phần code ở đó phải chịu trách nhiệm xử lý lỗi. Ví dụ: Để xử lý vấn đề cần thử một phương pháp thay thế, hoặc thông báo cho người dùng về việc đã xảy ra lỗi.

Có 4 cách để xử lý lỗi trong Swift. Bạn có thể thông báo lỗi đến hàm đã gọi hàm đó bằng cách xử dụng lệnh do-catch, xử lý lỗi là 1 giá trị tuỳ chọn: có thể xảy ra lỗi hoặc không.

Khi một hàm ném lỗi, nó sẽ thay đổi luồng code của bạn, vì vậy điều quan trọng là bạn có thể nhanh chóng xác định vị trí trong code của mình có thể gây ra lỗi. Để xác định những địa điểm này trong mã của bạn, hãy viết thử từ try? hoặc try! biến thể-trước một đoạn mã gọi một function, method, hoặc initializer có thể phát sinh một lỗi.

Để thấy rằng một function, method, hoặc initializer có thể phát sinh lỗi, bạn viết một từ khóa throws để gọi một throwing function. Nếu hàm chỉ định một kiểu trả về, bạn viết từ khóa throws trước khi cho phép trở về (->).

func canThrowErrors() throws -> String
 
func cannotThrowErrors() -> String

Một throwing function được throw bên trong của nó và báo lỗi về phần code gọi đến nó.

Dưới đây là ví dụ về lỗi của VendingMachine:

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 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)")
    }
}

Việc thực hiện hàm vend(itemNamed             </div>
            
            <div class=

0