【问题标题】:Is it possible to get the errno behind an IOException?是否有可能获得 IOException 背后的 errno?
【发布时间】:2017-01-18 22:58:32
【问题描述】:

我正在使用 Java 中的套接字,当套接字被另一端关闭时,我可能会遇到如下异常:

java.io.IOException: Broken pipe
java.io.IOException: Connection reset by peer

在这种情况下,我知道连接已断开(即strerror(EPIPE)strerror(ECONNRESET)),我应该对此采取措施。其他错误可能有其他含义,我可能可以继续使用套接字而没有问题。

但如果我在另一个语言环境下运行 Java,错误可能会变成:

java.io.IOException: Datenübergabe unterbrochen (broken pipe)
java.io.IOException: Die Verbindung wurde vom Kommunikationspartner zurückgesetzt

第一条消息仍然包含英文 (C) 消息,所以我可以匹配,但第二条没有。除了为我的图书馆提供所有语言环境的反向strerror 目录之外,还有什么方法可以找出这个异常背后的错误号?

【问题讨论】:

  • 只是一个问题,是否可以通过将默认 Locale 设置为英文来解决?然后你会把你的实际语言环境保存在另一个变量中?这将迫使您传递语言环境并在您通常不使用的任何地方使用它。
  • LC_MESSAGES 设置为C 有效,所以我想我会推荐给图书馆用户。不确定设置 Java 语言环境是否会在此处产生影响。

标签: java java-io


【解决方案1】:

通常您不会从java.io.IOException 获得错误编号。

这是因为在 Java 运行的所有平台上没有一致的错误编号。

【讨论】:

  • '通常'?您将永远java.io.IOException 获得errno 值。原因是没有为它提供API。
  • “从不”不是真的。甚至 Java 的标准库有时也会在 java.io.IOException 错误消息中包含来自操作系统的错误编号。
  • 请提供一个例子来支持您的主张。
  • 运行例如Runtime.getRuntime().exec("foo"); 或查看广泛使用的NET_ThrowByNameWithLastError 函数hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/windows/native/…
【解决方案2】:

你不需要知道。唯一需要稍微区分的IOExceptionSocketTimeoutException。所有其他的,可以说也是那个,尤其是你提到的两个,对连接都是致命的,所以唯一合理的做法是关闭套接字并忘记对等点。

【讨论】:

  • 虽然我同意一般前提,但有一些 IOException 是完全可以区分的,例如 CharacterEncodingException(如果您试图发现它)。
  • @OlivierGrégoire 然而,问题是关于被对等方关闭的套接字或断开的连接。
  • @EJP 标题和正文中提出的问题是关于获取IOException 后面的错误号。
  • 我想这回答了我的问题——如果没有非致命的IOExceptions(我只读/写字节缓冲区,所以没有CharacterEncodingException),那么我可以平等对待它们.谢谢。
  • @LucasWerkmeister 我只能建议您重新阅读我的答案。我没有在任何地方声明“没有非致命的IOExceptions”。事实上我说的恰恰相反。
【解决方案3】:

是的,这些 IOExcepton 中的每一个都是另一个的实例,这意味着您可以对 instanceof 检查进行对等检查,或者使用 getClass() 来解析错误名称。 例如,失败的绑定是 BindException 的实例

【讨论】:

  • 但是我会不会在堆栈跟踪中看到java.io.BindException: <message> 而不是java.io.IOException
  • 你的来源是什么?我在the list of subclasses of IOException 中没有看到任何Bind<Something>Exception
  • 嗯,这个类在它的 SocketException 下的层次结构中,docs.oracle.com/javase/7/docs/api/java/net/BindException.html
  • @ArsenArsen 好的,我的错。但是Broken pipeConnection reset by peer 是原始问题中提出的错误呢?
  • @OlivierGrégoire 我仍在尝试查找引发这些异常的库或导入名称。
猜你喜欢
  • 2019-02-12
  • 2020-01-13
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2021-04-26
相关资源
最近更新 更多