Xử lý lỗi trên Android

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 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:

Bảng: HomeException codes
Ý 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.