Java 如何知道异常来自何处?
我为一个解析类实现了一个run方法,该方法使用while循环处理一些输入管道,如下所示: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 (
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()
。这里并没有可能表示流结束的返回值:所以需要一个异常。这很好。但现在我觉得自己很愚蠢。我认为要中断我的主循环,我必须统计异常并停止过滤器(如果每个端口都已关闭)?您可以检查列表中的输入
中是否至少有一个端口已打开。如果没有找到,请退出主循环。