为什么异常故障字符串在不同的环境中有所不同?

时间:2010-11-05 11:02:04

标签: java exception

我有这段代码来处理捕获特定异常

private static final String CONNECTION_REFUSED_EXCEPTION = "java.net.ConnectException: Connection refused: connect";
...
} catch (org.apache.axis.AxisFault af) {

            if (af.getFaultString().equals(CONNECTION_REFUSED_EXCEPTION))
            {
               // Do something
            }
}

这在我的Windows开发环境中可以正常工作

但是,当我部署到unix机器进行测试时,故障字符串会有所不同,如下所示(注意:连接从最后丢失)

  • Windows错误字符串: java.net.ConnectException:连接 拒绝:连接
  • Unix故障字符串: java.net.ConnectException:连接 拒绝

为什么会这样?

为了记录,我相信以下内容更适合匹配故障字符串:

...
if(af.getCause() instanceof java.net.ConnectException)
...

4 个答案:

答案 0 :(得分:4)

'fault string'消息旨在提供用于调试目的的附加信息。它们可以在不同的实现,版本或环境中变化。这同样适用于所有异常消息字符串(Throwable.getMessage())。

应用程序代码依赖于Exception消息的确切文本,以便识别异常的原因。您建议使用instanceof来检查异常原因是一个更好的解决方案。

修改

如果您确实需要检查详细消息,因为它似乎发生在您的情况下(因为getCause()正在返回null),那么我建议检查详细消息是否包含名称您正在检查的特定包装异常(例如java.net.ConnectException)。如果getCause()首先没有返回null,那么您将获得相同的信息,并且应该尽量减少与详细消息的确切文本的依赖关系。

答案 1 :(得分:3)

很多原因:

  1. 异常消息字符串未标准化。
  2. 某些异常消息包括主机操作系统提供的消息。这些可能因操作系统而异,并且Java无法做到这一点。
  3. 源自Java的异常消息可以从一个版本更改为另一个版本以阐明其含义等。
  4. 源自Java的一些异常消息可能是特定于语言环境的。 (我认为这不适用于标准类库,但我可能错了。)
  5. 通常,应用程序的错误恢复代码依赖于特定的异常消息字符串是一个坏主意。如果您发现自己别无选择,请确保在插件类(或类似)中嵌入包含消息字符串依赖关系的代码,以便您可以轻松地为运行应用程序的不同OS平台创建不同的版本。 / p>

答案 2 :(得分:0)

Windows和Unix上的JVM是什么?如果它们不是来自同一供应商(例如Sun),则故障字符串可能略有不同。

答案 3 :(得分:0)

原始故障字符串(可能是?)来自apache轴库。如果您在两台计算机上使用相同的库版本,请仔细检查(字符串可能因版本而异)。另一个原因是“本地化”。某些故障字符串已本地化,在具有不同区域设置的计算机上可能不同。我也会检查一下。