Unity中API调用异常处理及向UI传递的方案问询
Unity API调用的错误处理与UI传递方案确认
我此前有ASP.NET API开发经验,这类项目里通常用错误处理中间件来精简控制器代码。现在我在研究Unity中调用API时的错误处理方式,以及如何将错误信息传递到用户界面,想确认这类场景下错误处理的时机和实现方式是否合理。
当前代码流程
现有代码采用controller/repository模式,流程如下:
- UI按钮触发
OnLoginButtonPressed事件 - AuthController类响应事件,调用Login方法执行逻辑:
public async void Login(LoginModel input) { var result = await AuthRepo.instance.Login(input); app.token = result; EventService.OnSuccessfulLogin(); }
- AuthRepo负责调用API并返回Token(JWT字符串的包装类),未添加异常处理的代码如下:
public async Task<Token> Login(LoginModel input) { string json = JsonConvert.SerializeObject(input); var request = UnityWebRequest.Post(app.baseURL + "authentication/login", json); request.SetRequestHeader("Content-Type", "application/json"); request.SendWebRequest(); while (!request.isDone) { await Task.Yield(); } if (request.result == UnityWebRequest.Result.Success) { Token token = JsonConvert.DeserializeObject<Token>(request.downloadHandler.text); return token; } else { throw } }
我设想的错误处理逻辑
为了给用户提示连接错误、无效输入等信息,我计划在AuthRepo中添加异常抛出逻辑:
if (request.result == UnityWebRequest.Result.Success) { Token token = JsonConvert.DeserializeObject<Token>(request.downloadHandler.text); return token; } else if (request.result == UnityWebRequest.Result.ConnectionError) { throw new ConnectionException(request.error); } else if (request.result == UnityWebRequest.Result.DataProcessingError) { throw new BadRequestException(request.error); } else { throw new System.Exception(request.error); }
这段判断逻辑会重复出现在每个仓库的每个API调用方法中,除非抽成辅助方法复用。之后在AuthController中捕获异常并触发对应事件通知UI:
try { var result = await AuthRepo.instance.Login(input); app.token = result; EventService.OnSuccessfulLogin(); } catch (ConnectionException ex) { EventService.OnConnectionError(ex.Message); // UI监听该事件并显示连接错误提示 } catch (BadRequestException ex) { EventService.LoginFailedError(ex.Message); } catch (Exception ex) { EventService.UnknownError(ex.Message); }
(注:原代码的finally块存在逻辑问题,无法直接访问异常对象,此处调整为捕获通用Exception分支处理未知错误)
疑问
这种处理方式是否合理?会不会导致代码被大量异常处理逻辑淹没?我看过一些YouTube视频,类似的处理思路被认可,但那些案例并未覆盖我这种API调用场景,因此想确认该方案的正确性。
内容的提问来源于stack exchange,提问作者Gary Frewin
相关产品推荐
相关产品推荐

