如何处理特定的 IOException?

How can I handle a specific IOException?

我有一个使用 Socket 和 SerialPort 的代码,我想处理特定的异常。使用 Socket 我没有问题,因为 SocketException class 有 SocketErrorCode 并且我在开关中使用它来处理错误,但我没有找到与 IOException class.[= 类似的东西11=]

是否有 IOException class 的异常列表?

try
{
    strTemp = "Command";
    fnWriteCommand(strTemp, communicationInterface);
    index = 10;
}
catch (SocketException socketEx)
{
    switch (socketEx.SocketErrorCode)
    {
        case SocketError.ConnectionRefused:
        case SocketError.ConnectionAborted:
        case SocketError.ConnectionReset:
        case SocketError.NotConnected:
            index = 0; // Restart sequence
            break;
        case SocketError.TimedOut:
            index = 10; // Retry
            break;
    }
}
catch (IOException IOEx)
{
    // Handle specific exceptions
}

IOException class 有几个派生的异常被抛出,提供了关于遇到的 IO 错误的更多信息。您可以单独捕获它们:

try { // Some code }
catch (System.IO.DirectoryNotFoundException) { }
catch (System.IO.DriveNotFoundException) { }
catch (System.IO.EndOfStreamException) { }
catch (System.IO.FileLoadException) { }
catch (System.IO.FileNotFoundException) { }
catch (System.IO.InternalBufferOverflowException) { }
catch (System.IO.InvalidDataException) { }
catch (System.IO.PathTooLongException) { }
catch (System.IO.IOException) { // Something else happened. Check InnerException details }

System.IO.Ports.SerialPort class 使用操作系统的低级端口通信功能的内部包装,System.IO.Ports.InternalResources

此模块处理 I/O 错误并将它们转换为托管 System.IO.IOException。不幸的是,其中一些不使用数字错误代码,仅使用需要翻译的文本(资源标识符和 en-us 翻译):

IO_PortNotFound "The specified port does not exist."
IO_PortNotFoundFileName "The port '{0}' does not exist."
IO_SharingViolation_NoFileName "The process cannot access the port because it is being used by another process."
IO_SharingViolation_File "The process cannot access the port '{0}' because it is being used by another process."

所有未映射到这四个异常字符串中的任何一个的 Winapi HREsult 代码都使用 HResult 和 Windows [=30= 的文本转换为 IOException ] 通过 FormatMessage API.

提供

IOException的众多子class中,只有EndOfStreamException用在了串口上下文中,可以专门抓到,或者这样查询:

if(IOEx is EndOfStreamException) 
{
    var eosex = IOEx as EndOfStreamException;
    ...
}