Đã cập nhật cho Swift 5.1
Giả sử hàm ném sau:
enum ThrowableError: Error {
case badError(howBad: Int)
}
func doSomething(everythingIsFine: Bool = false) throws -> String {
if everythingIsFine {
return "Everything is ok"
} else {
throw ThrowableError.badError(howBad: 4)
}
}
thử
Bạn có 2 tùy chọn khi bạn thử gọi một chức năng có thể ném.
Bạn có thể chịu trách nhiệm xử lý lỗi bằng cách bao quanh cuộc gọi của mình trong khối chặn bắt:
do {
let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
// Here you know about the error
// Feel free to handle or to re-throw
// 1. Handle
print("Bad Error (How Bad Level: \(howBad)")
// 2. Re-throw
throw ThrowableError.badError(howBad: howBad)
}
Hoặc chỉ cần thử gọi hàm và chuyển lỗi cho người gọi tiếp theo trong chuỗi cuộc gọi:
func doSomeOtherThing() throws -> Void {
// Not within a do-catch block.
// Any errors will be re-thrown to callers.
let result = try doSomething()
}
thử!
Điều gì xảy ra khi bạn cố gắng truy cập vào một tùy chọn ngầm được mở ra với một con số không bên trong nó? Vâng, đúng, ứng dụng sẽ CRASH! Cùng đi với thử! về cơ bản, nó bỏ qua chuỗi lỗi và tuyên bố một tình huống do do chết hoặc chết. Nếu hàm được gọi không ném bất kỳ lỗi nào, mọi thứ đều ổn. Nhưng nếu nó không thành công và gây ra lỗi, ứng dụng của bạn sẽ bị sập .
let result = try! doSomething() // if an error was thrown, CRASH!
thử?
Một từ khóa mới được giới thiệu trong Xcode 7 beta 6. Nó trả về một tùy chọn hủy bỏ các giá trị thành công và bắt lỗi bằng cách trả về nil.
if let result = try? doSomething() {
// doSomething succeeded, and result is unwrapped.
} else {
// Ouch, doSomething() threw an error.
}
Hoặc chúng ta có thể sử dụng bảo vệ:
guard let result = try? doSomething() else {
// Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.
Một lưu ý cuối cùng ở đây, bằng cách sử dụng try?
lưu ý rằng bạn đang loại bỏ lỗi xảy ra, vì nó được dịch thành con số không. Dùng thử? khi bạn tập trung nhiều hơn vào thành công và thất bại, không phải tại sao mọi thứ thất bại.
Sử dụng toán tử liên kết ??
Bạn có thể sử dụng toán tử liên kết ?? với thử không? để cung cấp một giá trị mặc định trong trường hợp thất bại:
let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value
let result = try doSomething() // Not within a do-catch block
) sẽ được gọi từ bên trong một phương thức được khai báo làthrows
, phải không? Vì vậy, nếudoSomething()
thất bại, thì phương thức bên ngoài cũng vậy (lần lượt)?