2016-06-16 110 views
-2

我已經實現瞭解析類的run方法,它處理一些輸入管道while循環是這樣的:如何知道異常來自哪裏?

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

     closePorts(); 
     break; 
    } 
} 

現在,我的問題是,我處理一個以上輸入流,所以我不能只關閉第一個異常的所有端口。我必須知道哪一個輸入流將它拋出,然後關閉那個流。

這裏的最佳做法是什麼?有沒有辦法將這些信息添加到異常本身?我是否必須將有關哪個輸入流的信息作爲String發送到消息,然後解析此String?

我想要做這樣的事情:

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

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

預先感謝您!

Philipp

+1

錯誤,爲每個端口上的I/O寫一個單獨的'catch'塊? – EJP

+0

使用異常來查找流的結束是不好的做法,一般來說...查看http://programmers.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious -antipattern-if-so-why – Rohan

+2

處理流的結束並不是特例。您應該檢測try-block內的流結束。例外情況適用於特殊情況,不適用於正常程序流程。 –

回答

1

您可能想嘗試捕獲單個呼叫。

在以下示例中,Input是假的類來說明這一點,和inputsInput一個List

請注意,break語句將退出for循環,您可能需要中斷到特定標籤以退出while循環,或者可能從您的方法返回。

while (true) { 

      for (Input input : inputs) { 

       try { 

         input.readSomething(); 

       } catch (EndOfStreamException e) { 

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

     } 
+0

這太好了。但現在我感到很蠢。我想打破我的主循環,我將不得不計算例外,並停止過濾器,如果每個端口我關閉? – Ipsider

+1

您可以檢查列表中的至少一個「Input」是否有開放端口。如果你沒有找到,退出你的主循環。 – Berger

+0

完美,謝謝:) – Ipsider

相關問題