如何忽略exception并完成尝试

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

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

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

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

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

如果有人能帮我解决这个问题,我会非常感激。

编辑:如果我只是添加代码serialport1.Open后,我得到: IOException的屏幕截图

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

一般情况下,如果你有一行代码导致exception,并且无论是否发生exception还有其他工作要做,你应该只使用一个catch ,并把你想要完成的东西放在try /的外面(之后) catch


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

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

serialPort1.Open();

什么是抛出exception。 通常在编码时,如果发生exception,则会清理连接。

正如其他人提到的,如果你继续调用同样的方法,除非有关调用的内容发生变化,否则你将继续获得exception。

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

来自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); }