Kotlin không hỗ trợ ngoại lệ được kiểm tra. Điều này giúp đơn giản hoá và hợp lý hoá 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 cần phải xử lý rõ ràng mọi 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.
Lỗi có thể khắc 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ệ, thì 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 Home API đều có thể gửi một
HomeException, vì vậy, bạn nên sử dụng khối try-catch để
bắt HomeException trên tất cả lệnh gọi.
Khi xử lý HomeException, hãy kiểm tra các trường
error.code và
error.message để tìm hiểu xem đã xảy ra lỗi gì. Cũng có thể có mã lỗi phụ, vì vậy, hãy gọi phương thức
getSubErrorCodes() và kiểm tra kết quả.
Mọi ngoại lệ không đượ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:
| Mã | Ý nghĩa |
|---|---|
ABORTED |
Thao tác đã bị huỷ, thường là do vấn đề về tính đồng thời, chẳng hạn như lỗi kiểm tra trình tự hoặc huỷ giao dịch. |
ALREADY_EXISTS |
Thực thể mà ứng dụng khách cố gắng tạo (ví dụ: tệp hoặc thư mục) đã tồn tại. |
API_NOT_CONNECTED |
Ứng dụng khách đã cố 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ị không có mạng hoặc không hỗ trợ API mà ứng dụng khách cố gắng gọi. |
CANCELLED |
Thao tác đã bị huỷ, thường là do phương thức gọi. |
COMMAND_FAILED |
Không thực thi được lệnh. Hãy kiểm tra mã lỗi phụ để biết thêm thông tin chi tiết. |
CURSOR_WINDOW_NOT_SUPPORTED |
Một phương thức sử dụng CursorWindow đã được gọi, nhưng CursorWindow không được bật hoặc không được hỗ trợ trong bối cảnh hiện tại. |
DATA_LOSS |
Đã xảy ra lỗi mất hoặc hỏng dữ liệu không thể khôi phục. |
DEADLINE_EXCEEDED |
Đã hết hạn 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. |
DECOMMISSIONING_INELIGIBLE |
Không thể ngừng hoạt động vì thiết bị không đủ điều kiện để ngừng hoạt động. |
FAILED_PRECONDITION |
Thao tác 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 lệnh stop của OvenCavityOperationalStateTrait được gọi 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ố bất biến mà hệ thống cơ bản dự kiến đã bị hỏng. Mã lỗi này được dành riêng cho các lỗi nghiêm trọng. |
INVALID_ARGUMENT |
Ứng dụng đã cung cấp một đối số nằm ngoài phạm vi giá trị dự kiến. |
INVALID_DATA_HOLDER |
Người giữ dữ liệu không hợp lệ. |
NOT_FOUND |
Không tìm thấy thực thể được yêu cầu, chẳng hạn như tệp hoặc thư mục.
Nếu yêu cầu bị từ chối đối với toàn bộ một nhóm người dùng, chẳng hạn như khi triển khai tính năng theo giai đoạn hoặc danh sách cho phép không có tài liệu, thì bạn có thể sử dụng NOT_FOUND.
Nếu một yêu cầu bị từ chối đối với một số người dùng trong một nhóm người dùng, chẳng hạn như quyền kiểm soát truy cập dựa trên người dùng, thì bạn phải sử dụng PERMISSION_DENIED. |
OUT_OF_RANGE |
Thao tác đã được thực hiện ngoài phạm vi hợp lệ, chẳng hạn như tìm kiếm hoặc đọc sau end-of-file. Không giống như INVALID_ARGUMENT, lỗi này cho biết một vấn đề có thể khắc phục được nếu trạng thái hệ thống thay đổi. |
PERMISSION_DENIED |
Trình gọi không có quyền thực thi thao tác đã chỉ định. Không được sử dụng PERMISSION_DENIED cho các trường hợp từ chối do hết tài nguyên (sử dụng RESOURCE_EXHAUSTED cho các lỗi đó).
Không được sử dụng PERMISSION_DENIED nếu không thể xác định phương thức gọi (sử dụng UNAUTHENTICATED cho các lỗi đó).
Mã lỗi này không có nghĩa là yêu cầu hợp lệ hoặc thực thể được yêu cầu tồn tại hoặc đáp ứng các điều kiện tiên quyết khác. |
RESOURCE_EXHAUSTED |
Một số tài nguyên đã hết, có thể là do đã đạt đến hạn mức cho mỗi người dùng hoặc toàn bộ hệ thống tệp đã hết dung lượng.
Ví dụ: lỗi này có thể xảy ra nếu lệnh dispense của DispenseTrait được gọi trên thiết bị cho thú cưng ăn nhưng không còn thức ăn trong thiết bị.Điều này cũng có thể là do bạn đã vượt quá hạn mức dự án Home API. Để biết thêm thông tin, hãy xem phần Quản lý hạn mức. |
SDK_INITIALIZATION_MISSING_INFO |
SDK đã được khởi chạy mà không có tất cả thông tin bắt buộc.
Ví dụ: lỗi này sẽ được gửi nếu ứng dụng cố gắng lấy TraitFactory cho một mã nhận dạng đặc điểm nhất định nhưng đặc điểm đó không được đưa vào khi khởi chạy SDK. Xem phần Khởi chạy nhà trên Android. |
UNAUTHENTICATED |
Không thể xác định 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 tăng dần. Xin lưu ý rằng không phải lúc nào cũng an toàn khi thử lại các thao tác không có tính luỹ đẳng. |
UNIMPLEMENTED |
Thao tác đượ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. 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 không có đủ thông tin về nguyên nhân gốc. |
WRITE_FAILED |
Không thực hiện được thao tác ghi. Hãy kiểm tra mã lỗi phụ để biết thêm thông tin chi tiết. |