类StatusException

gRPC中定义了两个和 Status 相关的异常,分别是 StatusException 和 StatusRuntimeException。以异常的实行来表示并传递状态信息。

类StatusException

代码足够简单,继承自Exception,通过传递一个 Status 对象实例来构建,并从Status对象实例中获取异常信息。

  1. public class StatusException extends Exception {
  2. private static final long serialVersionUID = -660954903976144640L;
  3. private final Status status;
  4. private final Metadata trailers;
  5. public StatusException(Status status) {
  6. this(status, null);
  7. }
  8. @ExperimentalApi
  9. // 使用状态和跟踪元数据来构建 exception
  10. // 这个方法是 1.0.0-pre2 之后才增加的
  11. public StatusException(Status status, @Nullable Metadata trailers) {
  12. super(Status.formatThrowableMessage(status), status.getCause());
  13. this.status = status;
  14. this.trailers = trailers;
  15. }
  16. public final Status getStatus() {
  17. return status;
  18. }
  19. }

Status.formatThrowableMessage()方法用于从 Status 中获取异常的 message 信息:

  1. 异常的message

    通过 Status 的formatThrowableMessage()方法从Status中得到message。

    formatThrowableMessage()方法的具体实现代码:

    1. static String formatThrowableMessage(Status status) {
    2. if (status.description == null) {
    3. // 如果没有description,则直接取code.toString()
    4. // code是一个枚举,code.toString()方法里面取的是枚举的name属性
    5. // 也就是 INVALID_ARGUMENT 之类的字符串
    6. return status.code.toString();
    7. } else {
    8. // 如果有description,则将code(同上实际是枚举的name)和description拼起来
    9. return status.code + ": " + status.description;
    10. }
    11. }
  2. 异常的casue:直接取Status对象的casue

类StatusRuntimeException

代码和实现与StatusException完全一致,只是继承的是RuntimeException。