【发布时间】: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