2012-11-28 283 views
1

我在使用EntityFramework時遇到問題。雖然下面的和平代碼工作正常在我的電腦上,當它被運送到一個VPS(一切正常預裝),它給了我一個未處理的異常:System.NullReferenceException:對象引用未設置爲對象的實例,但消息框這應該是抓住這個不出現。有什麼建議麼?實體框架問題

預先感謝您。

 var cc = new CopierContext(); 
     try 
     { 
      MessageBox.Show(cc.Database.Connection.ConnectionString.ToString()); 

      var matchingProviders2 = cc.Providers.Where(prov => prov.Login == "batman"); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.InnerException.Message); 
     } 

更新:

我終於抓住了問題的核心。原因是:我有VPS上的.NET 4,而應用程序是使用.NET 4.5開發的。安裝後者刪除了所有問題。謝謝你的幫助。

+1

究竟_does_顯示?第一個消息框?都不是? –

+0

將Trace.WriteLine(e)添加到您的異常處理程序。如果您可以使用調試器檢查輸出。如果應用程序部署的地方沒有可用的地方,請使用以下免費工具: [link](http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx) –

+0

@JoachimIsaksson:第一個出現沒有問題,第二個沒有問題。問題符合「matchingProviders2」,由於某種原因,當我將應用程序放置在其他地方時,它停止工作(我也複製了它所需的每個文件)。 – RobertasJ

回答

0

不要使用MessageBox,因爲它是一個服務;將它們記錄到磁盤上,以便您可以回憶它們,或者自動將它們郵寄給您,以便您瞭解發生的問題。

您還需要將e.InnerException.StackTrace添加到日誌中。

+0

我現在不需要登錄或郵寄它們。消息框完美適用於這種情況,因爲我試圖調試一直運行良好的東西,直到它在VPS上移動。 – RobertasJ

+0

@RobertasJ:好的,但您仍然沒有向我們提供堆棧跟蹤,因此您的消息框解決方案顯然無法正常工作。請在你的問題中提供更多的信息,並ping我,謝謝... –

1

我不知道你是如何在你的VPS上運行它的,但如果它沒有在交互式用戶帳戶下啓動,你的消息框就不會顯示出來。

+0

消息框工作正常,但感謝您的建議。 – RobertasJ

0

我敢打賭,你沒有配置一些東西(或沒有正確配置它)和cc.Database.Connection.ConnectionString爲空。調用.ToString()會導致NullReferenceException。這就是爲什麼你沒有看到消息框。正如其他人所說 - 使用MessageBox進行這種調試並不是一個好主意。在catch中,你應該打印不是消息,但是e.ToString()會顯示應該指向問題出處的堆棧跟蹤。

+0

即使'cc'爲空,這也不能解釋爲什麼它會是'未處理的異常',因爲這將在catch塊中處理。 –

+0

你說你能看到消息框 - 不是這個消息框抓塊?這個問題確實需要更多的細節 - 包括堆棧跟蹤,因爲我開始想知道是否從您顯示的代碼中拋出異常...... – Pawel

+0

@Pawel:連接字符串在此處被硬編碼:@「Server = localhost; Database = CopierDatabase; Trusted_Connection = TRUE;」 – RobertasJ

1
從上 Exception.InnerException物業

InnerException屬性的文檔

那麼既然你捉回來作爲被傳遞到 構造相同的值,或空引用

任何舊的異常catch (Exception e)它很有可能是拋出的異常不是你期望的異常,也沒有InnerException異常。這意味着您的catch塊可能會引發異常。

您可以採取多種措施。

  1. 不要在除頂層異常處理程序之外的任何東西中捕獲System.Exception異常。只有發現你知道該怎麼處理的例外情況。這導致...
  2. 設置頂級異常處理程序
  3. 最後在記錄或顯示異常消息時,至少確保在嘗試使用它之前有內部異常。

    MessageBox.Show((e.InnerException != null ? e.InnerException : e).Message);

+0

@ConradFrax:你很重要。您會在下面看到堆棧跟蹤和異常。 – RobertasJ