C# 如何忽略异常并完成重试

C# 如何忽略异常并完成重试,c#,serial-port,ioexception,C#,Serial Port,Ioexception,所以我已经争论了大约一个星期了,我想我知道这个问题,但我不想在那里报告一个答案,直到我确定下来 简而言之,在尝试使用SerialPort.Open()命令时,我遇到了一个IOException。事实证明,这是非常常见的,大多数终端程序实际上也这样做,但他们只是忽略了它。请阅读我上面的帖子,了解完整的故事。现在我要做的是忽略IOException,但仍然打开串行端口。我不能用try/catch做这件事,至少我不知道怎么做 我想知道是否有一种方法可以尝试一些东西,并以某种方式声明“我知道会抛出一个问

所以我已经争论了大约一个星期了,我想我知道这个问题,但我不想在那里报告一个答案,直到我确定下来

简而言之,在尝试使用
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。打开后我会得到:


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

一般来说,如果您有一行代码导致异常,并且无论异常是否发生,都有额外的工作要做,您应该使用一个
catch
,并将您想要做的事情放在外部(后面)
尝试
/
捕获


对于您的特殊情况(在另一个问题中描述),您正在处理可怕的中断,即.NET
System.IO.Ports.SerialPort
。打开串行端口成功,但是
SerialPort.Open
是一个复杂的方法,它需要做大量额外的工作,如果任何额外的(和不必要的)工作失败,它会坚持关闭端口。我还发现了
System.IO.Ports.SerialPort
的其他问题(例如,无法按内部设备名称打开端口)。依我看,越早摆脱
System.IO.port.SerialPort越好


您可以p/调用Win32串行端口函数(
CreateFile
和其他函数),也可以找到已经编写了包装器库的人(我写过,但不公开提供)。

通常,如果您有一行代码导致异常,并且无论是否发生异常,都有其他工作要做,你应该只使用一个
catch
,然后把你想做的事情放在
尝试
/
catch
之外


对于您的特殊情况(在另一个问题中描述),您正在处理可怕的中断,即.NET
System.IO.Ports.SerialPort
。打开串行端口成功,但是
SerialPort.Open
是一个复杂的方法,它需要做大量额外的工作,如果任何额外的(和不必要的)工作失败,它会坚持关闭端口。我还发现了
System.IO.Ports.SerialPort
的其他问题(例如,无法按内部设备名称打开端口)。依我看,越早摆脱
System.IO.port.SerialPort越好

您可以p/调用Win32串行端口函数(
CreateFile
和其他函数),也可以找到已经编写了包装器库的人(我写了,但没有公开提供)

serialPort1.Open()

是引发异常的原因。通常在编写代码时,如果发生异常,您会清理连接

正如其他人所提到的,如果您继续调用相同的方法,您将继续得到异常,除非有关调用的事情发生变化

因此,我的建议是,除了serialPort1.open()之外,您应该寻找其他方法来打开串行端口;呼叫在C#中可能有也可能没有构建方式。所以你可能必须要有创意:)

serialPort1.Open()

是引发异常的原因。通常在编写代码时,如果发生异常,您会清理连接

正如其他人所提到的,如果您继续调用相同的方法,您将继续得到异常,除非有关调用的事情发生变化

因此,我的建议是,除了serialPort1.open()之外,您应该寻找其他方法来打开串行端口;呼叫在C#中可能有也可能没有构建方式。所以你可能必须要有创意:)

来自:

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

端口处于无效状态

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

我打赌这就是正在发生的事情。。。您的串行端口最近已打开,现在您正试图在准备就绪之前再次打开它

我的建议是写一个循环,在开始尝试之间稍微休息一下。计算出你愿意在多长时间内尝试多少次<代码>成功后中断
循环

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);
}
发件人:

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

端口处于无效状态

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

我打赌这就是正在发生的事情。。。您的串行端口最近已打开,现在您正在尝试