Xử lý lỗi trên Android

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:

Bảng: HomeException mã
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.