Kotlin không hỗ trợ các ngoại lệ đã kiểm tra . Điều này giúp đơn giản hoá và tinh giản quy trình 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 ngoại lệ có thể xảy ra, nên mã của bạn sẽ ít bị lộn xộn hơn và do đó, vẫn tập trung hơn vào mục đích chính.
Các 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ột 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 cho người dùng thấy 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}",
)
}
Mọi phương thức trong API Nhà thông minh đều có thể gửi một
HomeException, vì vậy, bạn nên sử dụng khối try-catch để
nắm bắt 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
error.code và
error.message để tìm hiểu điều gì đã xảy ra. 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ệ 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ỷ, 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ắ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ị ở chế độ ngoại tuyến 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 trình gọi. |
COMMAND_FAILED |
Lệnh không thực thi được. Hãy kiểm tra mã lỗi phụ để biết thêm chi tiết. |
CURSOR_WINDOW_NOT_SUPPORTED |
Một phương thức đã được gọi bằng
CursorWindow, nhưng
một 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 tình trạng mất hoặc hỏng dữ liệu không thể khôi phụ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. |
DECOMMISSIONING_INELIGIBLE |
Quá trình ngừng hoạt động không thành cô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ò đã 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 mong đợi đã bị phá vỡ. Mã lỗi này dành riêng cho các lỗi nghiêm trọng. |
INVALID_ARGUMENT |
Ứng dụng khách đã cung cấp một đối số nằm ngoài phạm vi giá trị dự kiến của. |
INVALID_DATA_HOLDER |
Trình 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 một yêu cầu bị từ chối đối với toàn bộ lớp người dùng, chẳng hạn như việc triển khai dần dần
tính năng hoặc danh sách cho phép không được ghi lại, thì NOT_FOUND
có thể được dùng.
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 lớp người dùng,
chẳng hạn như kiểm soát quyền truy cập dựa trên người dùng, PERMISSION_DENIED
phải được sử dụng. |
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 ngoài end-of-file. Không giống như
INVALID_ARGUMENT, lỗi này
cho biết một vấn đề có thể được khắc phụ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. PERMISSION_DENIED không được dùng cho các trường hợp từ chối do cạn kiệt một số tài nguyên (hãy dùng RESOURCE_EXHAUSTED cho những lỗi đó).
PERMISSION_DENIED không được dùng nếu không xác định được trình gọi (hãy dùng UNAUTHENTICATED cho những lỗi đó).
Mã lỗi này không ngụ ý rằng yêu cầu là 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 đã cạn kiệt, có thể là do đạt đến hạn mức cho mỗi người dùng
đạt đến hoặc toàn bộ hệ thống tệp hết dung lượng.
Ví dụ: lỗi này có thể được gửi nếu lệnh
dispense của
DispenseTrait được gọi trên một 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 vượt quá hạn mức dự án API Nhà thông minh. Để biết thêm thông tin, hãy xem 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 khách 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. Hãy xem bài viết
Khởi chạy nhà thông minh trên Android. |
UNAUTHENTICATED |
Không xác định được trình 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 rất 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 chờ luỹ tiến. Xin lưu ý rằng bạn không phải lúc nào cũng có thể thử lại các thao tác không có tính lũy đẳ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
xảy ra 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 một 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. |
WRITE_FAILED |
Không thực thi được thao tác ghi. Hãy kiểm tra mã lỗi phụ để biết thêm chi tiết. |