尝试catch神秘地继续执行代码(只是有时..)

本文关键字:代码 执行 catch 继续 尝试 | 更新日期: 2023-09-27 18:25:26

在下面的C#代码中,假设sample是20000。然后,调用Convert.ToInt16的行将在尝试转换20000*3.2(大于32768)时抛出溢出异常。

在该异常中,它将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
            }
        }
    }
}

尝试catch神秘地继续执行代码(只是有时..)

您的代码在成功转换后将标志设置为false,并在处理程序中设置为true。

如果你的代码有好的和坏的转换,标志会切换,你会得到多个错误。

您可以将设置移回"false",以确保每个错误只打印一次。也许用计数器代替bool。仅当计数器为0时输出错误。这样,您就可以知道错误发生了多少次(出于调试目的),但只报告一次。