状态 - 类StatusException
优质
小牛编辑
133浏览
2023-12-01
gRPC中定义了两个和 Status 相关的异常,分别是 StatusException 和 StatusRuntimeException。以异常的实行来表示并传递状态信息。
类StatusException
代码足够简单,继承自Exception,通过传递一个 Status 对象实例来构建,并从Status对象实例中获取异常信息。
public class StatusException extends Exception {
private static final long serialVersionUID = -660954903976144640L;
private final Status status;
private final Metadata trailers;
public StatusException(Status status) {
this(status, null);
}
@ExperimentalApi
// 使用状态和跟踪元数据来构建 exception
// 这个方法是 1.0.0-pre2 之后才增加的
public StatusException(Status status, @Nullable Metadata trailers) {
super(Status.formatThrowableMessage(status), status.getCause());
this.status = status;
this.trailers = trailers;
}
public final Status getStatus() {
return status;
}
}
Status.formatThrowableMessage()方法用于从 Status 中获取异常的 message 信息:
异常的message
通过 Status 的formatThrowableMessage()方法从Status中得到message。
formatThrowableMessage()方法的具体实现代码:
static String formatThrowableMessage(Status status) {
if (status.description == null) {
// 如果没有description,则直接取code.toString()
// code是一个枚举,code.toString()方法里面取的是枚举的name属性
// 也就是 INVALID_ARGUMENT 之类的字符串
return status.code.toString();
} else {
// 如果有description,则将code(同上实际是枚举的name)和description拼起来
return status.code + ": " + status.description;
}
}
异常的casue:直接取Status对象的casue
类StatusRuntimeException
代码和实现与StatusException完全一致,只是继承的是RuntimeException。