未知来源的“;IO异常未处理”;在关闭应用程序期间

本文关键字:应用程序 异常 未知 IO 未处理 | 更新日期: 2023-09-27 18:00:02

我正在努力防止在我的应用程序中使用串行连接的用户出现任何奇怪的行为。

我的应用程序通过USB->串行转换器连接到设备。在我确定端口可用、已连接并准备就绪后,我正在设置发送数据的环境,但我也想准备好任何用户是否会拔下通信电缆,所以我使用以下代码。

try
{
  serialPort.WriteLine("BT'r"); 
}
catch (IOException ioe)
{
  Console.WriteLine(ioe.Message);
  currentCommunicationState = DEVICE_COMMUNICATION_STATES.IDLE;
  // other stuff which set application in idle mode; buttons statuses, etc
}

上面的异常处理得很好。应用程序进入空闲模式,我可以使用它,但是。。。当我关闭应用程序时,我会得到下一个异常,没有任何指定的详细信息。我找不到第二个异常被抛出的位置,也找不到如何保存这种情况。

System.IO.IOException was unhandled
Message="Specified port doesn't exist"
Source="System"
StackTrace:
   w System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   w System.IO.Ports.SerialStream.Dispose(Boolean disposing)
   w System.IO.Ports.SerialStream.Finalize()
InnerException:

从控制台记录

Port 'COM29' nie istnieje. ''port COM28 doesn't exist - called from my exception handler
A first chance exception of type 'System.IO.IOException' occurred in System.dll
The thread 0x14d4 has exited with code 0 (0x0).
The thread 0x1e98 has exited with code 0 (0x0).

未知来源的“;IO异常未处理”;在关闭应用程序期间

当抛出第一个异常时,您需要清除用于通信的SerialStream。您得到的异常是程序试图处理该流。

在异常处理程序中,关闭串行端口流。

这篇文章似乎有一些关于这个问题的信息。简而言之,端口的Dispose方法有缺陷,导致终结器出错。IMO这是错误的行为。

如果您确信您在正确的时间处理了所有内容,并且仍然遇到这个问题,那么您应该将Port类子类化,以便在Dispose(bool disposing)方法的重写中放置一些更健壮的错误处理。您可以用一点try/catch来包装基类调用。