2016-01-19 39 views
1

全部,使用SAP JCO(v3.0)時,如何在JCoContext.end()期間處理異常?

我們目前開發了一個Java客戶端應用程序,通過JCO v3.0 API與SAP進行通信。在有狀態調用期間,調用多個BAPI函數時,我們使用JCoContext類來建立有狀態會話。我們在JCoFunctions執行前調用JCoContext.begin(),並在所有函數完成後在finally塊中調用JCoContext.end()。

問題出現在JCoContext.end()上。它可能會引發JCoException。關於爲什麼會發生異常或如何處理異常,文檔不是很清楚。在測試中,當NULL目標傳遞給JCoContext.end()方法時,我能夠觀察到異常。雖然這可能發生,但我們的生產代碼中絕對不會出現這種情況。所以問題依然存在,還有什麼其他原因會導致異常?

此外,如果未調用JCoContext.end()方法,我觀察到奇怪的行爲。在那些案例中,我看到後來的BAPI電話沒有成功完成。這表明如果end()方法沒有成功完成,它可能會使JCo處於不良狀態。那麼,我們應該如何處理這裏發生的異常。我作爲開發人員有什麼追索權?看來,我唯一的保證是關閉程序。

讓我知道如果您有任何意見,謝謝,

保羅·曼寧

回答

1

此問題已通過在SCN論壇的SAP員工回答。我在那裏交叉問題。這裏是鏈接:

SAP Forum Question: SAP JCo: How to handle an Exception thrown by JCoContext.end()

作爲總結,如果傳入的「目的地」參數爲NULL的JCoContext.end()方法應該只拋出一個異常,或者有一個bug在SAP JCO。所以,你必須確保「目標」是非空的。如果遇到其他問題,請向SAP提交支持服務單。

結束了。

-Paul

0

JCO例外的基本認識可以用this description實現。 而SAP documentation狀態這種風格的異常處理:

JCoDestination destination = JCoDestinationManager.getDestination("<destination>"); 

try 
{ 
    JCoContext.begin(destination); 
    function1.execute(destination); 
    function2.execute(destination); 
    functionBapiTransactionCommit.execute(destination); 
} 
catch (AbapException ex) 
{ 
    ... 
} 
catch (JCoException ex) 
{ 
    ... 
} 
catch (Exception ex) 
{ 
    ... 
} 
finally 
{ 
    JCoContext.end(destination); 
} 
+0

您剛剛發佈的樣板代碼附帶JCO作爲示例,並且很清楚,它不能回答我的問題。您的finally塊調用JCoContext的end()方法,但不會在那裏捕獲任何異常。你的assertion end()方法不會拋出異常是錯誤的。 end()方法的API文檔聲明:「.... JCoException - 在發佈/關閉連接時遇到問題」。如果這發生在您發佈的代碼中,那麼該例外將優先於上面的execute()方法期間的任何以前的異常。 – g8torPaul

+0

是的,我承認我錯了。你在finally塊中使用eng()語句嗎?也許這個異常是由catch塊中拋出的前一個異常引起的,而這個異常是隱藏的? – Suncatcher

+0

end()方法在finally塊中被調用(它在我的原始文章中以及在您發佈的代碼中再次顯示)。我特別討論了從end()方法拋出的潛在異常。這種方法在什麼情況下拋出異常?如果拋出異常,SAP中的LUW將不會完成。這會很糟糕。 JCO似乎沒有任何API來解決這個問題。因此我原來的問題。我希望有一個對JCO/SAP代碼有深入瞭解的人幫助。如果您沒有這方面的知識,請不要回復此郵件。 – g8torPaul