2014-10-02 57 views
0

在下面的C#代碼中,假設sample是,比如說20000. 然後調用Convert.ToInt16的行會引發溢出異常,因爲它試圖轉換20000 * 3.2(大於32768)。Try ... catch mysteriously繼續執行代碼(有時只有...)

在該異常中,它將bool標誌設置爲true(dataErrorWritten),它應該會停止錯誤消息被多次寫入。

但是,我所看到的是一些情況下,錯誤消息每次都會不斷寫入,並且看起來dataErrorWritten標誌沒有做任何事情。這怎麼可能?一旦第一次發現異常,dataErrorWritten[i]將被設置爲true,並且在下次出現異常時不應打印任何錯誤。事實上,這在99%的時間內工作,但是在某些奇怪的情況下它不會。

ProcessInData在靜態類中的自己的線程上運行。

任何想法將不勝感激。謝謝。 我已經在這個程序中追蹤了一個多線程錯誤(共享數據隊列無鎖),我想這可能與多線程有關,但我看不出如何。

private static bool[] dataErrorWritten; 

private static void ProcessInData() 
{ 

    short[][] bufferedData = new short[800][]; 
    short sample; 


    //initialise this bool array to false 
    dataErrorWriten = new bool[32]; 
    for (int i = 0; i < 32; i++) 
    { 
     dataErrorWriten[i] = false; 
    } 

    //create buffered data arrays 
    for (int i = 0; i < bufferedData.Length; i++) 
    { 
     bufferedData[i] = new short[32]; 
    } 

    //loop always true 
    while (processData) 
    { 
     //... Increment bufferLocation 

     for (int i = 0; i < 32; i++) { 

      //Get a sample of data 
      sample = GetSampleFromSomewhere(); 

      try { 
       bufferedData[bufferLocation][i] = Convert.ToInt16(((float)sample * 3.2); 
       dataErrorWritten[i] = false; 
      } 
      catch (Exception) { 
       if (!dataErrorWritten[i]) { 
        EventLog.WriteToErrorLogFile("Invalid UDP sample value " + sample + " received for channel " + (i + 1).ToString() + "."); 
        dataErrorWritten[i] = true; 
       } 

       // ... set buffered data within bounds 

      } 
     } 
    } 

} 

回答

1

您的代碼在處理程序中成功完成convert和true之後將該標誌設置爲false。

如果您的代碼混合了好的和壞的轉換,該標誌將切換,並且您會收到多個錯誤。

您可以將設置移回「false」以確保每個錯誤只打印一次。也許使用計數器而不是布爾。只有在計數器爲0時才輸​​出錯誤。這樣您就知道錯誤發生了多少次(用於調試目的),但只報告一次。

+0

感謝您的幫助!而已。很簡單。 – Rhett 2014-10-02 01:12:04