Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thrift异常中的异常消息是如何工作的?_Java_Scala_Thrift_Thrift Protocol - Fatal编程技术网

Java Thrift异常中的异常消息是如何工作的?

Java Thrift异常中的异常消息是如何工作的?,java,scala,thrift,thrift-protocol,Java,Scala,Thrift,Thrift Protocol,I节约IDL文件,您可以定义自己的异常类型,服务方法可能会抛出: exception SampleException { 1: list<string> failed } 异常示例异常{ 1:列表失败 } 在日志中看到适当的异常消息的契约是什么?我在foo.bar.Service中看到过这样的日志消息:未处理的异常 my.package.SomeException:null。我猜它在哪里说null这应该是异常消息 不幸的是,例外情况没有很好的记录。我是否应该添加一个字符串

I节约IDL文件,您可以定义自己的异常类型,服务方法可能会抛出:

exception SampleException {
    1: list<string> failed
}
异常示例异常{
1:列表失败
}
在日志中看到适当的异常消息的契约是什么?我在foo.bar.Service中看到过这样的日志消息:
未处理的异常
my.package.SomeException:null
。我猜它在哪里说
null
这应该是异常消息

不幸的是,例外情况没有很好的记录。我是否应该添加一个
字符串消息
字段以使其正常工作?是否有其他类似字段名称的转换?

节俭例外(一般情况下) 在日志中看到适当的异常消息的契约是什么

没有合同定义如何将消息写入任何日志。节俭被设计成协议不可知论和运输不可知论。例如,如果您构建的HTTP服务器在其日志文件中写入了某些内容,这完全超出了Thrift,这只是您的HTTP服务器的问题

我是否应该添加一个字符串消息字段以使其正常工作?是否有其他约定,如字段名称

不,除了您选择的语言可能强加的内容外,没有任何约定或限制。从技术上讲,
异常
类似于
结构
。例如,以下IDL取自该文件

上面使用的
Xtruct
是嵌套在异常中的另一个
struct
。你看,你几乎可以用structs做任何可能的节约异常。这使您能够向客户端发送丰富的错误信息,而不仅仅是一个字符串,上面写着“服务器上发生了一些不好的事情”之类的内容

struct
的区别在于系统如何处理异常:异常在服务器上序列化,然后在客户端重新引发。意外的异常是

  • 捕获并重新抛出为泛型
    TApplicationException
  • 或者根本没被抓住
后一种行为在某种程度上依赖于语言,现在正慢慢地从“未捕获”转变为“作为泛型
TApplicationException
”方向

不幸的是,例外情况没有很好的记录

以下是关于例外情况的说明:

2.4例外情况

异常在语法和功能上等同于结构 除非它们是使用
异常
关键字声明的 属于
struct
关键字

生成的对象根据需要从异常基类继承 在每个目标编程语言中,为了无缝地 与任何给定语言中的本机异常处理集成。 同样,设计的重点是使代码熟悉 给应用程序开发人员

如何确保调用了
异常(字符串)
CTOR? 我看到过这样的日志消息:

Unhandled exception in foo.bar.Service my.package.SomeException: null 
我猜它在哪里说
null
这应该是异常消息?[…]对于生成到Scala/Java的已定义异常,什么是确保调用此构造函数的正确方法:
公共异常(字符串消息)

看起来很像“从不”,或者更确切地说是“不可能”。这些是Thrift(trunk版本)通过上述IDL生成的所有系数:

  public Xception() {
  }

  public Xception(
    int errorCode,
    String message)
  {
    this();
    this.errorCode = errorCode;
    setErrorCodeIsSet(true);
    this.message = message;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public Xception(Xception other) {
    __isset_bitfield = other.__isset_bitfield;
    this.errorCode = other.errorCode;
    if (other.isSetMessage()) {
      this.message = other.message;
    }
  }

没有很好的记录?听起来像是一个常见的借口,可以理解为“我太懒了,找不到它”。除此之外,这不是一个糟糕的问题。对不起,我不是有意冒犯任何人。当我搜索异常文档时,那个节俭白皮书从来没有出现过。我同意过去的情况并不总是这样,但特别是白皮书自2007年以来就已经存在,并且与。我重新表述:对于生成到Scala/Java的已定义异常,什么是确保调用此构造函数的正确方法:
公共异常(字符串消息)
  public Xception() {
  }

  public Xception(
    int errorCode,
    String message)
  {
    this();
    this.errorCode = errorCode;
    setErrorCodeIsSet(true);
    this.message = message;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public Xception(Xception other) {
    __isset_bitfield = other.__isset_bitfield;
    this.errorCode = other.errorCode;
    if (other.isSetMessage()) {
      this.message = other.message;
    }
  }
} catch (org.apache.thrift.TException te) {
  throw new Exception(te.toString());
}