Kotlin không hỗ trợ trường hợp ngoại lệ đã kiểm tra. Điều này giúp đơn giản hoá và tinh giản việc xử lý lỗi, vì bạn có thể chọn chỉ xử lý những ngoại lệ có khả năng khôi phục. Và vì bạn không phải xử lý rõ ràng mọi trường hợp ngoại lệ có thể xảy ra, nên mã của bạn sẽ ít lộn xộn hơn và do đó, vẫn tập trung hơn vào mục đích chính của mã.
Lỗi có thể khôi phục là những vấn đề mà nhà phát triển có thể giải quyết từ phía họ.
Ví dụ: nếu mã nhận dạng được dùng trong lệnh gọi không hợp lệ, API sẽ gửi một HomeException
kèm theo thông báo invalid data
. Sau đó, nhà phát triển ứng dụng có thể chọn xoá mã nhận dạng đó khỏi bộ nhớ đệm hoặc hiển thị cho người dùng một thông báo như "Không tìm thấy cấu trúc".
Ví dụ về cách xử lý lỗi có thể khôi phục:
val result =
try {
homeManager.requestPermissions()
} catch (e: HomeException) {
PermissionsResult(
PermissionsResultStatus.ERROR,
"Got HomeException with error: ${e.message}",
)
}
Bất kỳ phương thức nào trong API Home đều có thể gửi một HomeException
, vì vậy, bạn nên sử dụng khối try-catch
để phát hiện HomeException
trên tất cả các lệnh gọi.
Khi xử lý HomeException
, hãy kiểm tra các trường code
và message
để tìm hiểu xem đã xảy ra lỗi gì.
Mọi ngoại lệ chưa được xử lý sẽ khiến ứng dụng của bạn gặp sự cố.
Bảng sau đây cung cấp ý nghĩa của các mã HomeException
mà bạn có thể gặp phải:
Mã | Ý nghĩa |
---|---|
ABORTED |
Thao tác đã bị huỷ. Lỗi này thường xuất hiện khi có vấn đề về tính đồng thời, chẳng hạn như không kiểm tra được trình tự hoặc huỷ giao dịch. |
ALREADY_EXISTS |
Tài nguyên hoặc thực thể mà bạn đang cố gắng tạo đã tồn tại. Ví dụ: đây có thể là lịch biểu được đặt tên cho một máy điều nhiệt. |
API_NOT_CONNECTED |
Ứng dụng khách đã cố gắng gọi một phương thức từ một API không kết nối được. Điều này có thể xảy ra khi thiết bị đang ở trạng thái ngoại tuyến hoặc không hỗ trợ API mà bạn đang cố gắng gọi. |
CANCELLED |
Thao tác đã bị huỷ, thường là do phương thức gọi. |
DATA_LOSS |
Mất hoặc hư hỏng dữ liệu và không phục hồi được. |
DEADLINE_EXCEEDED |
Thời hạn đã hết trước khi thao tác có thể hoàn tất. Đối với các thao tác thay đổi trạng thái của hệ thống, lỗi này có thể được trả về ngay cả khi thao tác đã hoàn tất thành công. |
FAILED_PRECONDITION |
Thao tác này bị từ chối vì hệ thống không ở trạng thái cần thiết để thực thi thao tác. Ví dụ: bạn có thể nhận được thông báo này nếu gọi stop trên một lò nướng đã dừng. |
INTERNAL |
Lỗi nội bộ. Điều này có nghĩa là một số hằng số không đổi mà hệ thống cơ bản dự kiến đã bị phá vỡ. Mã lỗi này được dành riêng cho các lỗi nghiêm trọng. |
INVALID_ARGUMENT |
Bạn đã cung cấp một đối số nằm ngoài phạm vi giá trị dự kiến. |
NOT_FOUND |
Bạn đã chỉ định một thực thể hoặc tài nguyên không tìm thấy. Ví dụ: chỉ định mã nhận dạng bản nhạc không tồn tại khi gọi
activateAudioTrack trên thiết bị phát nội dung nghe nhìn. |
OUT_OF_RANGE |
Một tham số đã vượt quá phạm vi hợp lệ, dựa trên trạng thái hệ thống hiện tại. Thông báo này xuất hiện khi giá trị nằm trong phạm vi giá trị mà lệnh gọi API có thể chấp nhận, nhưng không có ý nghĩa trong ngữ cảnh hiện tại. |
PERMISSION_DENIED |
Bạn không có quyền thực thi thao tác đã chỉ định. Bạn không nên diễn giải mã lỗi này theo nghĩa là yêu cầu hợp lệ. |
RESOURCE_EXHAUSTED |
Một số tài nguyên đã hết. Ví dụ: ngoại lệ này có thể được gửi khi người dùng gọi
dispense trên thiết bị cho thú cưng ăn và không còn thức ăn trong thiết bị. |
SDK_INITIALIZATION_MISSING_INFO |
SDK chưa được khởi chạy đầy đủ. Ví dụ: bạn sẽ nhận được thông báo này nếu cố gắng lấy TraitFactory cho một đặc điểm chưa được đăng ký. Xem phần Khởi chạy. |
UNAUTHENTICATED |
Không xác định được phương thức gọi hoặc yêu cầu không có thông tin xác thực hợp lệ. |
UNAVAILABLE |
Dịch vụ này hiện không hoạt động. Đây có thể là một điều kiện tạm thời, có thể được khắc phục bằng cách thử lại với thời gian đợi. Xin lưu ý rằng không phải lúc nào việc thử lại các thao tác không idempotent cũng an toàn. |
UNIMPLEMENTED |
Thao tác đã yêu cầu không được triển khai, hỗ trợ hoặc bật trong dịch vụ này. |
UNKNOWN |
Lỗi không xác định. Nhìn chung, UNKNOWN xuất hiện khi xảy ra một điều kiện lỗi không thể phân loại bằng bất kỳ mã lỗi nào khác. Ví dụ: lỗi này có thể được trả về khi giá trị trạng thái nhận được từ một API bên ngoài thiếu thông tin đầy đủ về nguyên nhân gốc rễ. |