如何忽略异常并完成尝试

时间:2013-02-21 23:20:08

标签: c# serial-port ioexception

所以我现在和this issue进行了大约一个星期的斗争并且认为我知道这个问题,但我不想在那里报告答案,直到我把它固定下来。

简而言之,我在尝试使用SerialPort.Open()命令时遇到IOException。事实证明,这是非常常见的,大多数终端程序实际上也是如此,但他们只是忽略它。请阅读上面的帖子,了解完整的故事。现在我想要做的是忽略IOException但仍然打开串口。我不能用try / catch做到这一点,或者至少我不知道怎么做。

我想知道有没有办法尝试某种方式并以某种方式表明“我知道会抛出一个问题,这是一个安全的问题,我选择忽略该异常并继续完成任务”。要清楚,我不想忽略错误然后继续前进。我想忽略错误,仍然完成操作

以下是我最好的猜测,但它不起作用。

        try
        {
            serialPort1.Open();               
        }
        catch (System.IO.IOException)
        {
            MessageBox.Show("An IO Exception occurred.");
        }
        finally
        {          
            //SAFELY IGNORE ERROR AND DO TASK ANYWAY HERE
        }

如果有人能帮助我,我会非常感激。

编辑:如果我之后只添加代码serialport1.Open,我会得到: Screenshot of IOException

这与没有try / catch的情况基本相同。我想要做的就是说我正在尝试这样做:我不在乎它会抛出错误,无论如何都要这么做。

3 个答案:

答案 0 :(得分:4)

一般情况下,如果您有一行代码导致异常,并且无论是否发生异常还有其他工作要做,您应该只使用catch,然后将您想要完成的内容放入其中在try / catch之外(之后)。


对于您的特定情况(在您的其他问题中描述),您正在处理可怕的破坏,即.NET System.IO.Ports.SerialPort。打开串口成功,但是SerialPort.Open是一个复杂的方法,可以执行大量额外的操作,并且如果任何额外(和不必要的)内容失败,则坚持关闭端口。我也发现了System.IO.Ports.SerialPort的其他问题(例如,无法通过其内部设备名称打开端口)。 IMO,越早摆脱System.IO.Ports.SerialPort越好。

你可以p /调用Win32串行端口函数(CreateFile,其余的是here)或者找一个已经写过包装器库的人(我做了,但它不是公开的)。

答案 1 :(得分:0)

  

serialPort1.Open();

是抛出异常的原因。通常在编码时,如果发生异常,则会清除连接。

正如其他人提到的,如果你继续调用同样的方法,除非有关呼叫的事情发生变化,否则你将继续获得异常。

所以要理解,我的建议是你要寻找其他方法来打开串口,而不是serialPort1.Open();呼叫。 C#中可能有也可能没有内置方式。所以你可能需要有创意:)

答案 2 :(得分:0)

来自SerialPort.Open

  

每个SerialPort对象只能存在一个打开的连接。   任何应用程序的最佳实践是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭。

  

端口处于无效状态。

     
      
  • 或 -
  •   
     

尝试设置基础端口的状态失败。例如,从此SerialPort对象传递的参数无效。

我打赌这就是正在发生的事情......你的SerialPort最近刚打开,现在你想在它准备好之前再次打开它。

我的建议是写一个循环,并在Opening尝试之间稍微睡一会儿。弄清楚你有多少次愿意尝试多长时间。当你成功时,break离开了循环。

foreach(int i in Enumerable.Range(1, numberOfAttempts)
{
  try
  {
    serialPort1.Open();
    break;
  }
  catch(Exception ex)
  {
    //log attempt #i failed because of ex
  }
  Thread.Sleep(millisecondsToWait);
}