2017-08-07 18 views
-1

這裏是我的代碼:如何在JAVA的try catch框中捕捉特定的行異常?

public void serveFromSableV2() { 
    String merchantCustomerID = ObfuscatedId.construct(request.getMerchantCustomerID()).getPublicEntityId(); 
    try { 
     List<MerchantMarketplaceBO> merchantMarketplaceBOList = new MerchantMarketplaceBO(merchantCustomerID, null).getAllMerchantMarketplacesBOsByMerchant(); 

     Vector<Marketplace> resultVector = new Vector<>(); 
     for (MerchantMarketplaceBO entity : merchantMarketplaceBOList) { 
      MarketplaceBO marketplaceBOObject = new MarketplaceBO(entity.getMarketplaceID()); 
      marketplaceBOObject.loadFromSable(); 

      if (marketplaceBOObject.isActive()) { 
       resultVector.add(marketplaceBOObject.getCodigoMarketplace()); 
      } 
     } 

     if (resultVector.isEmpty()) { 
      throw new InvalidIDException(); 
     } 

     this.response = new getMarketplacesByMerchantIncludingInactiveResponse(); 
     response.setWrapperValue(resultVector); 
    } catch (EntityNotFoundException | SignatureMismatchException | InvalidIDException e) { 
     throw new InvalidIDException("merch=" + merchantCustomerID + "[" + request.getMerchantCustomerID() + "]"); //C++ stack throws InvalidIDException if marketplace is not found in datastore 
    } 
} 

現在對於任何例外,它拋出我不想外界抓住它一個特定的行(marketplaceBOObject.loadFromSable();),我想通過單獨處理它再次繼續我的循環。我不想在這個try catch中使用另一個try catch。有人可以指導我嗎?

+1

*爲什麼*你不想使用另一個try/catch?這是做這件事的明顯方式。 –

+0

我對此不太確定,但是我的老大讓我不要使用它。還有其他的方式嗎? –

+0

不是特別愉快,沒有。 (我可能會提取一個子方法來使整個事情變得更清潔,但是......)如果你的老人添加了一個要求,不要用最明顯的方法去做某件事,你應該問他們他們*希望你如何處理這個。 –

回答

4

我不想在此try catch中使用另一個try catch。

是的。

MarketplaceBO marketplaceBOObject = new MarketplaceBO(entity.getMarketplaceID()); 
try { 
    marketplaceBOObject.loadFromSable(); 
} catch (WhateverException e) { 
    // Do something here, or, if you prefer, add the exception to a list and process later 
    doSomething() ; 
    // Continue your loop above 
    continue ; 
} 
if (marketplaceBOObject.isActive()) { 

如果你真的不想這樣做,你loadFromSable()方法可以返回一些對象,它提供有關呼叫的成功/失敗的信息。但我不會推薦。

3

做到這樣 - 這樣你的代碼的其餘部分將運行不管有異常或不

 for (MerchantMarketplaceBO entity : merchantMarketplaceBOList) { 
      MarketplaceBO marketplaceBOObject = new MarketplaceBO(entity.getMarketplaceID()); 

      try{ 
       marketplaceBOObject.loadFromSable(); 
       if (marketplaceBOObject.isActive()) { 
        resultVector.add(marketplaceBOObject.getCodigoMarketplace()); 
       } 

      } 
      catch{ 
       if (marketplaceBOObject.isActive()) { 
        resultVector.add(marketplaceBOObject.getCodigoMarketplace()); 
       } 
      } 

     } 
+0

這不會在Java中編譯 - 每個catch塊*都有*指定一個異常。 (這裏的重複肯定是不愉快的......) –

+0

哦,是的!我在代碼中錯過了這個「(Exception excep)」。無論他是否願意,重複都取決於所有者。 –

0

您可以重構加載到捕獲並返回異常,而不是一個單獨的方法把它扔:

private Optional<Exception> tryLoadFromSable(MarketplaceBO marketplaceBOObject) { 
    try { 
     marketplaceBOObject.loadFromSable(); 
     return Optional.empty(); 
    } 
    catch(Exception e) { 
     return Optional.of(e); 
    } 
} 

然後你的循環中:

//inside for loop... 
MarketplaceBO marketplaceBOObject = new MarketplaceBO(entity.getMarketplaceID()); 
Optional<Exception> loadException = tryLoadFromSable(marketplaceBOObject); 
if(loadException.isPresent()) { 
    //Do something here, log it, save it in a list for later processing, etc. 
} 
+0

返回一個文字'NULL'並不是不好的建議! –

+1

@蒂莫西·卡特萊爾廢話,在這種情況下與返回假相同 – Palamino

+0

至少我看到了一個很大的區別:一個(原始)布爾值永遠不會引發NPE! –

0

另一個「絕招」對付那就是身體移動到循環到具有「額外」 try/catch塊單獨的方法:

private MarketplaceBO loadFromSable(MerchantMarketplaceBO entity){ 
    MarketplaceBO marketplaceBOObject = new MarketplaceBO(entity.getMarketplaceID()); 
    try {   
     marketplaceBOObject.loadFromSable(); 
    } catch (WhateverException e) { 
     // do something to make marketplaceBOObject a valid object 
     // or at least log the exception 
    } 
    return marketplaceBOObject; 
} 

但是因爲我們要堅持以抽象原則同層我們還需要將該方法的其他部分移至新的更小方法:

public void serveFromSableV2() { 
    String merchantCustomerID = ObfuscatedId.construct(request.getMerchantCustomerID()).getPublicEntityId(); 
    try { 
     List<MerchantMarketplaceBO> merchantMarketplaceBOList = 
      getAllMerchantMarketplacesBOsByMerchant(); 
     Vector<Marketplace> resultVector = new Vector<>(); 
     for (MerchantMarketplaceBO entity : merchantMarketplaceBOList) { 
      MarketplaceBO marketplaceBOObject = loadFromSable(entity); 
      addToActiveMarketplacesList(marketplaceBOObject,resultVector); 
     } 
     verifyHavingActiveMarketPlaces(resultVector); 
     setResponseWithWrapped(resultVector); 
    } catch (EntityNotFoundException | SignatureMismatchException | InvalidIDException e) { 
     throw new InvalidIDException("merch=" + merchantCustomerID + "[" + request.getMerchantCustomerID() + "]"); //C++ stack throws InvalidIDException if marketplace is not found in datastore 
    } 
}