Как я могу обработать определенное IOException? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть код, который использует Socket и SerialPort, и я хотел бы обработать определенные исключения.С Socket у меня нет проблем, потому что класс SocketException имеет SocketErrorCode, и я использую его в переключателе для обработки ошибок, но я не нахожу что-то похожее для класса IOException.

Есть ли списокисключений для класса IOException?

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
}

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Класс System.IO.Ports.SerialPort использует внутреннюю оболочку для низкоуровневых коммуникационных функций порта операционной системы, System.IO.Ports.InternalResources .

Этот модуль имеет дело сОшибки ввода / вывода и преобразует их в управляемые 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."

Все коды WinREi HREsult, которые не сопоставлены ни с какимииз этих четырех строк исключений преобразуются в IOException с использованием HResult и текста, который Windows API предоставляет через FormatMessage API.

Из множества подклассов IOException только EndOfStreamException используется в контексте serialport и может быть специально перехвачен или опрошен следующим образом:

if(IOEx is EndOfStreamException) 
{
    var eosex = IOEx as EndOfStreamException;
    ...
}
0 голосов
/ 21 декабря 2018

Класс IOException имеет несколько производных исключений, которые генерируют больше информации об обнаруженной ошибке ввода-вывода.Вы можете поймать их индивидуально:

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 }
...