2014-12-04 10 views
2

問題背景我的應用程序的工作我的PC(Windows 7)中,但不是另一個(XP)上,我不知道如何繼續診斷問題

我一直在開發我的電腦上的數據庫應用程序(Windows 7,使用Visual Studio 2010 Express),並且它一直按預期工作。我剛將最新版本複製到運行Windows XP的PC上,並引發"Program has encountered an error and needs to close"錯誤消息。

應用程序事件日誌中的錯誤消息中的信息顯示錯誤發生在initializeDatabaseConnection()(根據堆棧跟蹤) - 這是一個相當短的方法,它只包含幾行代碼。

dbConnection = new MySql.Data.MySqlClient.MySqlConnection("server=myserver; 
                  uid=myuser; 
                  pwd=mypassword; 
                  database=mydatabase;"); 
dbCommand = new MySql.Data.MySqlClient.MySqlCommand(); 
dbCommand.Connection = dbConnection; 

試圖診斷

  • 我添加了一個try-catch在代碼中initializeDatabaseConnection()捕捉任何Exception並調用MessageBox.Show(ex.ToString()問題採取

    步驟 - 如發生之前同樣的錯誤並且它不顯示消息框。它說有一個未處理的異常,儘管在堆棧跟蹤中顯示了此方法。

  • 我在catch塊中添加了一個更具體的處理程序,其中一個用於System.IO.FileLoadException這是事件日誌條目描述的特定錯誤消息。與上面的通用異常處理程序相同的行爲發生。

  • 我發現它描述了應用程序和預期一樣,直到移動到不同的機器,建議Visual Studio遠程調試的問題上堆棧溢出的問題 - 但是我使用Visual Studio 2010 快遞根據the documentation這是不是我可以使用的功能。

  • 關於Stack Overflow的A similar question建議,作爲第一步,檢查應用程序所針對的.NET Framework的版本是否高於其他PC可以處理的版本。我把它切換到3.5,同樣的錯誤仍然發生,並且我確信另一臺PC已經運行了很多4.0應用程序。

  • same question建議您檢查您在Build Settings建設爲平臺,以確認它設置爲x86 - 我已經這樣做了,這是。

  • 我增加了一個未處理的異常事件處理程序通過Aybe的建議這表明問題是Could not load file or assembly, MySql.Data ... etc. ...但是我不確定爲什麼這個錯誤會發生突然,作爲構建的早期版本中發揮預期。


解決方案

  • MySql.Data.dll版本所需的應用是6.8.3.0但在一個文件夾中是6.9.3.0 - 我不知道爲什麼它需要6.8.3.0現在的版本在客戶端PC上的應用程序文件夾中尚未更改,並且6.9.3.0正在使用以前的版本。

我發現這要感謝下面的評論,建議我實施UnhandledExceptionEventHandler並鏈接到文檔以瞭解如何操作。這是我以前沒有意識到的CLR的一個特點。謝謝!

+0

如果我的問題不清楚或不恰當,我真的很感謝一些建議,以改善它,請。看到低估等等,並且不明白我的問題出了什麼問題,只要我可以告訴它它符合SO的要求,並且我儘可能地做了大量的研究。謝謝:) – Eilidh 2014-12-04 14:57:06

+1

兩個提示:你是否嘗試捕獲未處理的異常(http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception%28v=vs.110%29.aspx)? Visual Studio社區是免費的,如果你能買得起交換機,你會得到新的功能。 – Aybe 2014-12-04 15:00:17

+0

是的,我做到了。那麼,我有理由確定我做了 - 堆棧跟蹤顯示異常發生在'initializeDatabaseConnection()'和(如上所述)我在那裏使用了一個'try-catch',但它仍然顯示'未處理的異常'在事件日誌條目,奇怪。 – Eilidh 2014-12-04 15:02:03

回答

0

雖然我仍然不確定爲什麼Exception未被處理(因爲根據應用程序事件日誌條目的堆棧跟蹤,異常發生在一個方法中,其中所有代碼都被一個通用異常catch -block封裝),所以我事實上,它能夠通過使用UnhandledExceptionEventHandler來捕獲未處理的異常。

public static void Main() 
{ 
    AppDomain.CurrentDomain.UnhandledException 
     += new UnhandledExceptionEventHandler(MyHandler); 
} 

static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
{ 
    Exception e = (Exception) args.ExceptionObject; 
    // Do what you like with the exception 
} 
+1

您無法捕獲代碼中的異常,因爲當JIT編譯器試圖*編譯*該方法時發生異常 - 因此您的代碼(包括任何代碼'try' /'catch'塊)開始運行。應該(我認爲)在這個方法的更高層級上的'try' /'catch'能夠捕獲它,但是不能在沒有編譯的方法中阻塞。 – 2014-12-05 08:53:50

+0

Ahhhaaa ...這很有道理。謝謝! – Eilidh 2014-12-05 08:54:48

相關問題