Kotlin không hỗ trợ 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}",
)
}
Mọi phương thức 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ỷ, thường là do vấn đề đồ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 tìm cách tạo, chẳng hạn như một 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ị không có kết nối 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. |
DATA_LOSS |
Đã xảy ra sự cố mất hoặc hỏng dữ liệu và 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. |
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 lệnh stop của OvenCavityOperationalStateTrait được gọi trên một lò đã dừng hoặc nếu bạn cố gắng chạy thao tác rmdir trên một thư mục không phải là thư mục. |
INTERNAL |
Lỗi nội bộ. Điều này có nghĩa là một số hằng số 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 |
Ứng dụng khách đã cung cấp một đối số nằm ngoài phạm vi giá trị dự kiến. |
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ộ một lớp người dùng, chẳng hạn như việc ra mắt tính năng từng bước hoặc danh sách cho phép chưa được ghi nhận, 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 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, 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 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 |
Phương thức 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 sử dụng hết một số 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 xác định được phương thức gọi (sử dụng UNAUTHENTICATED cho các lỗi đó).
Mã lỗi này không 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 đã hết, có thể là do đã đạt đến hạn mức trên 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ị. |
SDK_INITIALIZATION_MISSING_INFO |
SDK đã được khởi chạy mà không có đầy đủ thông tin bắt buộc.
Ví dụ: lỗi này sẽ xảy ra nếu ứng dụng khách cố gắng lấy TraitFactory cho một mã đặ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 trang chủ trên Android. |
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ụ 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 việc thử lại các thao tác không idempotent không phải lúc nào 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. 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ễ. |