Java 如何知道异常来自何处?

Java 如何知道异常来自何处?,java,exception,exception-handling,stream,Java,Exception,Exception Handling,Stream,我为一个解析类实现了一个run方法,该方法使用while循环处理一些输入管道,如下所示: while (true) { try { // do something } catch (EndOfStreamException e) { closePorts(); break; } } while (true) { try { // do something } catch (

我为一个解析类实现了一个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;
    }
}
现在,我的问题是我正在处理多个输入流,所以我不能在第一个异常上关闭所有端口。我必须知道哪个输入流抛出了它,然后完全关闭该流

这里的最佳实践是什么?有没有办法将该信息添加到异常本身?我是否必须将关于哪个inputstream以字符串的形式发送到消息,然后解析该字符串

我想这样做:

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;
    }
}
提前谢谢你


Philipp

您可能想尝试接听单个电话

在下面的示例中,
Input
是一个假类来说明这一点,
Input
Input
列表

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

while (true) {

            for (Input input : inputs) {

                try {

                        input.readSomething();

                } catch (EndOfStreamException e) {

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

        }

错误,在每个端口上为I/O写一个单独的
catch
块?使用异常查找流的结尾是不好的做法,一般来说…请参阅处理流的结尾不是例外情况。您应该在try块中检测流的结束。异常用于异常情况,而不是正常的程序流。@Rohan您通常对此没有任何选择。JRE中有许多API设计用于在流末尾抛出
EOFException
。对此你确实无能为力。“例外情况不应用于流量控制”这一显然广为传播的理论在术语上是矛盾的。异常是流控制:没有两种方法。@FabianBarney异常是流控制,当带内返回值不可用时,它们是必不可少的,例如
DataInputStream.readInt()
。这里并没有可能表示流结束的返回值:所以需要一个异常。这很好。但现在我觉得自己很愚蠢。我认为要中断我的主循环,我必须统计异常并停止过滤器(如果每个端口都已关闭)?您可以检查列表中的
输入
中是否至少有一个端口已打开。如果没有找到,请退出主循环。