×

Khai báo hàm có thể ném lỗi với throws trong Swift

Trong lập trình Swift, quản lý lỗi là một phần quan trọng của việc phát triển ứng dụng, giúp đảm bảo các hoạt động của ứng dụng diễn ra mượt mà và có thể xử lý những tình huống không mong muốn. Swift cung cấp các công cụ mạnh mẽ để xử lý lỗi, một trong số đó là khả năng khai báo hàm có thể ném lỗi. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng từ khoá throws trong ngôn ngữ Swift để khai báo hàm có thể ném lỗi và cách xử lý các lỗi đó.

Khai báo hàm có thể ném lỗi

Khi bạn muốn khai báo một hàm trong Swift có thể ném lỗi, bạn sử dụng từ khoá throws ngay trước kiểu dữ liệu trả về của hàm. Việc này cho phép hàm đó có khả năng ném ra lỗi trong quá trình thực hiện, và bất kỳ hàm nào gọi đến hàm này cũng phải xử lý hoặc truyền tiếp lỗi.

Dưới đây là cú pháp cơ bản để khai báo một hàm có thể ném lỗi:

func someFunction() throws -> ReturnType {
    // Code that might throw an error
}

Hãy cùng xem một ví dụ cụ thể ở đây:

enum MyError: Error {
    case runtimeError(String)
}

func potentiallyFailingFunction() throws -> String {
    let success = Bool.random()
    if success {
        return "Success!"
    } else {
        throw MyError.runtimeError("Something went wrong!")
    }
}

Gọi hàm có thể ném lỗi

Khi bạn gọi một hàm có khả năng ném lỗi, bạn phải sử dụng từ khoá try. Có ba cách chính để gọi hàm này:

  1. Do-Catch Block: Đây là cách phổ biến nhất để xử lý lỗi. Bạn bao bọc đoạn mã gọi hàm bằng khối do và xử lý lỗi bằng các khối catch.
do {
    let result = try potentiallyFailingFunction()
    print(result)
} catch MyError.runtimeError(let message) {
    print("Caught an error: \(message)")
} catch {
    print("Caught an unknown error")
}
  1. Try?: Biến đổi kết quả thành một giá trị tùy chọn (optional). Nếu hàm ném lỗi, giá trị trả về sẽ là nil.
if let result = try? potentiallyFailingFunction() {
    print(result)
} else {
    print("The function failed")
}
  1. Try!: Sử dụng khi bạn chắc chắn rằng hàm sẽ không ném lỗi. Nếu hàm ném lỗi, ứng dụng sẽ bị crash.
let result = try! potentiallyFailingFunction()
print(result)

Tạo và ném lỗi tùy chỉnh

Trong Swift, bạn có thể định nghĩa các lỗi của riêng mình bằng cách tạo các kiểu dữ liệu tuân theo chuẩn Error. Điều này cho phép bạn chi tiết hơn trong việc miêu tả các tình huống lỗi.

enum DataError: Error {
    case notFound
    case corrupted
}

Bạn có thể ném các lỗi này trong các hàm của mình như sau:

func fetchData(from filename: String) throws -> Data {
    guard let data = ... // code to fetch data
    else {
        throw DataError.notFound
    }
    // process data
    return data
}

Tóm lược

Sử dụng throws trong Swift là một cách thức hữu hiệu để quản lý lỗi một cách rõ ràng và an toàn. Qua việc khai báo hàm có thể ném lỗi và xử lý chúng bằng các cơ chế như do-catch, try?, và try!, bạn có thể tạo ra các ứng dụng đáng tin cậy hơn. Việc định nghĩa các lỗi tùy chỉnh giúp bạn rõ ràng hơn trong việc miêu tả và xử lý các tình huống lỗi cụ thể, giúp cho mã nguồn của bạn trở nên dễ đọc và dễ bảo trì hơn.

Comments