2012-07-18 16 views
0

我有一個IndexOutOfRangeException的客戶報告,但報告它的行號沒有數組訪問!該生產線的形式爲:沒有數組訪問的IndexOutOfRangeException

using (XyzConnection conn = new XyzConnection(anObject.aProperty.anotherProperty)) 

XyzConnectionanObject等都是由更換名稱,但結構基本上是相同的。

上面本身可以扔IndexOutOfRangeException嗎?

是否有可能的是,數組訪問(和例外)是從上面的行稱爲一些代碼,即構造函數或屬性吸氣劑的一個?我如何識別正確的位置?

我應該提到,該問題無法在開發環境中重現,也無法在客戶機器上安裝Visual Studio。

+0

從組件過得好行號提供給客戶?發佈程序集通常在PDB中沒有行號信息... – 2012-07-18 20:32:56

+0

可能會在XyzConnection構造函數中引發異常? – davenewza 2012-07-18 20:33:09

+1

您需要完整的堆棧跟蹤。 – asawyer 2012-07-18 20:34:34

回答

0

首先想到的是,PDB與正在使用的DLL版本不匹配。對於索引超出範圍異常的代碼行提示沒有任何提示。沒有看到圍繞該調用的代碼和構造函數聲明本身,我懷疑人們可以給予多少幫助。

另一件事來檢查誤導行號而言,如果代碼使用try/catch塊,確保catch塊被重新引發異常使用「拋」;不是「扔掉」; (其中ex是捕獲的異常)。這會導致異常跟蹤堆棧被重新生成。 (既費時又覆蓋潛在的有用信息)。

+0

我不知道'拋出'V/S'拋出EX'。這很可能會導致我們面臨的其他一些問題。我很確定他們正在使用正確的DLL,但是有一種方法可以讓我確切知道哪個dll會被加載?我正在考慮Java中的[this](http://stackoverflow.com/a/4546650/18573)方法 – 2012-07-18 22:47:44

+0

是的,您可以通過反射獲得組件細節,但這意味着將新程序集分發給客戶端。它引發了一些問題,例如程序集是從GAC加載的,還是希望從運行目錄加載。它是應用程序,Windows服務還是Web應用程序的一部分? – 2012-07-19 00:48:55

+0

這是一個應用程序。問題在客戶機上重現,我可以爲他們提供新的程序集。我無法在該機器上安裝Visual Studio,因此沒有任何其他機制可行。這不是你看到的最好的代碼,所以如果我有代碼審查的替代方案,我會非常高興。 – 2012-07-19 01:00:07

2

上面本身可以拋出IndexOutOfRangeException嗎?

這行不能在其本身拋出異常。

XyzConnection構造函數方法中的某些代碼可能會這樣做,或者anObject.aProperty的屬性獲得方可能會拋出它,或者aProperty.anotherProperty的屬性獲取方也可能正在拋出。我敢打賭,它是財產獲得者之一。

它們可以由JIT編譯器內聯,因此你不會看到它們在堆棧跟蹤,無論PDB的你有什麼。這實際上很常見,因爲特性獲取器通常很小且很簡單,這使得它們成爲內聯的理想候選者。

我建議那些2所屬性獲取的可靠的代碼進行審查,隨後由XyzConnection構造

+0

屬性獲取器是微不足道的,但構造函數不是所以我懷疑它會被內聯。是否有任何其他原因堆棧跟蹤會給出不正確的方法/行號?我會按照您的代碼審查意見。 – 2012-07-19 00:36:38