Java中如何传递含401未授权异常的Throwable对象?
解决方法:构造401未授权异常并传入回调
嘿,我来帮你搞定这个需求!你需要给tokenCallback.failure()传入一个明确代表401未授权的Throwable实例,结合你的现有代码,这里有两种实用的实现方式:
1. 利用现成的AuthFailureError(适合已有框架的场景)
你代码里已经注释了new AuthFailureError(),其实这就是个很好的选择——很多网络框架(比如Volley)里的AuthFailureError本身就用来表示认证失败,刚好对应401未授权场景。你可以给它加上明确的错误消息,让回调方更清楚异常原因:
修改你的else分支代码:
}else{ // token已过期,构造401未授权异常 Log.e(TAG,"token expired"); // 创建带提示消息的AuthFailureError Throwable unauthorizedError = new AuthFailureError("401 Unauthorized: Access Token已过期,请重新认证"); tokenCallback.failure(unauthorizedError); }
如果你的AuthFailureError支持传入HTTP响应对象,还可以直接指定状态码,让异常信息更精准:
// 假设框架支持通过NetworkResponse构造(比如Volley的实现) NetworkResponse response = new NetworkResponse(401, null, null, false); Throwable unauthorizedError = new AuthFailureError(response); tokenCallback.failure(unauthorizedError);
2. 自定义401专属异常类(适合无现成框架的场景)
如果项目里没有现成的认证失败异常类,你可以自己定义一个,让异常类型更清晰:
先创建自定义异常类:
public class UnauthorizedException extends RuntimeException { // 无参构造,默认提示401 public UnauthorizedException() { super("401 Unauthorized: 未授权访问"); } // 带自定义消息的构造 public UnauthorizedException(String message) { super(message); } }
然后在你的代码中使用这个异常:
}else{ Log.e(TAG,"token expired"); Throwable unauthorizedError = new UnauthorizedException("Access Token已过期,需要重新登录"); tokenCallback.failure(unauthorizedError); }
额外小提示:回调方如何识别401异常
为了让处理回调的代码能准确判断这是401未授权异常,可以在回调实现中做类型判断:
tokenCallback = new TokenCallback() { @Override public void success(String token) { // 处理token可用的逻辑 } @Override public void failure(Throwable throwable) { // 判断是否是401相关异常 if (throwable instanceof AuthFailureError || throwable instanceof UnauthorizedException) { // 执行重新登录、刷新token等逻辑 Log.e(TAG, "触发401未授权:" + throwable.getMessage()); } else { // 处理其他类型的异常 } } };
内容的提问来源于stack exchange,提问作者sagar suri
相关产品推荐
相关产品推荐

