Lỗi và thử lại an toàn
Command của screen
Command (lệnh) của screen trả về một ProjectVResult. Khi IsSuccess là false,
hiện Message; nội dung này đã được viết sẵn cho người chơi. View tự cập nhật
qua Observe, nên không cần vẽ thêm gì khác.
var result = await shop.PurchaseAsync(offerId, quantity);
if (this != null && !result.IsSuccess)
{
ShowMessage(result.Message);
}
Command của presenter
Command của presenter trả về một ProjectV*CommandResult có IsSuccess và
Snapshot mới nhất. Vẽ (render) snapshot trước, rồi đến lỗi:
var result = await startup.StartAsync(contentReady: true, token);
Render(result.Snapshot);
if (!result.IsSuccess)
{
ShowLocalized(result.Snapshot.Error?.LocalizationKey, result.Snapshot.Error?.RequestId);
}
Exception nghĩa là lỗi lập trình (tham số sai, presenter bị dùng từ sai scene), không phải lỗi server. Đừng dùng exception cho luồng điều khiển thông thường.
Hiện gì
| Lỗi có | Hiện |
|---|---|
LocalizationKey (Startup, Authentication, Account, Lobby presenter) | Tra trong localization của game; nếu không có thì dùng một thông báo chung |
SafeMessage (màn có dữ liệu, Gameplay data) | Hiện nguyên văn, hoặc ánh xạ Code sang văn bản của bạn |
Đặt RequestId vào panel hỗ trợ hoặc chi tiết; nhờ nó team SDK tìm được
request. Không bao giờ hiện hay ghi log token, mật khẩu hoặc response thô của
server.
Huỷ
Command của presenter nhận một CancellationToken; gắn nó với trang, ví dụ
MonoBehaviour.destroyCancellationToken. Command c ủa screen không nhận token:
hãy kiểm tra trang còn tồn tại trước khi dùng kết quả.
Huỷ chỉ dừng việc chờ của bạn. Nó không hoàn tác thao tác mà server có thể đã áp dụng.
Khi nào thử lại
| Tình huống | Làm gì |
|---|---|
| Lần tải đầu thất bại | Cho phép thử lại (Retry) |
| Server từ chối một thao tác | Hiện lý do; không tự động gửi lại |
| Một thao tác bị timeout hoặc không rõ kết quả | Không gửi thao tác mới; chờ màn cập nhật, rồi để người chơi quyết định |
| Quyết toán nhiệm vụ thất bại | Giữ màn kết quả mở và thử lại đúng lần hoàn thành đó |
ContractMismatch lúc khởi động | Chặn lại; bản build và backend không khớp nhau |
| Session hết hạn | Quay lại qua Login |
Không bao giờ gửi lại một lượt mua, nâng cấp hay nhận thưởng chỉ vì lần gọi đầu bị timeout, và không bao giờ viết vòng lặp thử lại vô tận trong view.
Xem Xử lý sự cố cho các vấn đề về thiết lập và runtime.