尝试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
}
}
}
}
您的代码在成功转换后将标志设置为false,并在处理程序中设置为true。
如果你的代码有好的和坏的转换,标志会切换,你会得到多个错误。
您可以将设置移回"false",以确保每个错误只打印一次。也许用计数器代替bool。仅当计数器为0时输出错误。这样,您就可以知道错误发生了多少次(出于调试目的),但只报告一次。