【问题标题】:How to know where an exception comes from?如何知道异常来自哪里?
【发布时间】:2016-06-16 09:37:30
【问题描述】:

我已经为一个解析类实现了一个 run 方法,它用这样的 while 循环处理几个输入管道:

while (true) {
    try {
        // do something
    }
    catch (EndOfStreamException e) {

        closePorts();
        break;
    }
}

现在,我的问题是我要处理多个输入流,所以我不能在第一个异常时关闭所有端口。我必须知道哪个输入流抛出了它,然后完全关闭该流。

这里的最佳做法是什么?有没有办法将该信息添加到异常本身?我是否必须将有关哪个输入流的信息作为字符串发送到消息中,然后解析该字符串?

我想做这样的事情:

while (true) {
    try {
        // do something
    }
    catch (EndOfStreamException e) {

        closePort(e.getIndexOfPort);    // something like this??
        break;
    }
}

提前谢谢你!

菲利普

【问题讨论】:

  • Err,为每个端口的 I/O 写一个单独的 catch 块?
  • 使用异常来查找流的结尾是不好的做法,一般来说...见programmers.stackexchange.com/questions/189222/…
  • 处理流的结尾不是一个例外情况。您应该在 try-block 内检测到流的结束。例外是针对例外情况,而不是针对正常的程序流程。
  • @Rohan 你经常别无选择。 JRE 中有许多 API设计 以在流结束时抛出 EOFException。您对此无能为力。 “异常不应用于流量控制”这一看似普遍的理论在术语上是自相矛盾的。例外流控制:没有两种方法。
  • @FabianBarney 异常流控制,当带内返回值不可用时它们是必不可少的,例如(例如)DataInputStream.readInt()。这里没有可能表示流结束的可能返回值:因此需要异常。

标签: java exception exception-handling stream


【解决方案1】:

您可能想尝试接听个别电话。

在下面的例子中,Input 是一个假类来说明这一点,inputsListInput

注意break 语句将退出for 循环,您可能需要中断到特定标签以退出while 循环,或者可能从您的方法返回。

while (true) {

            for (Input input : inputs) {

                try {

                        input.readSomething();

                } catch (EndOfStreamException e) {

                    closePort(input.getPort()); 
                    break;
                }
            }

        }

【讨论】:

  • 这很棒。但现在我觉得自己很愚蠢。我认为为了打破我的主循环,如果我关闭了每个端口,我将不得不计算异常并停止过滤器?
  • 您可以检查列表中至少有一个Input 有一个开放的端口。如果找不到,请退出主循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多