Как обрабатывать различные типы исключений из одного и того же объекта исключения? - PullRequest
0 голосов
/ 02 октября 2018

Например, Исключения Socket могут возвращать либо сообщение, связанное с тайм-аутом, либо сообщение «активно отказано», которое обычно вызывается закрытым портом / портом, используемым для чего-то другого.

Как правильно выполнить случай переключенияна основании этого?
Я могу просто сделать ex.Message.Contains(), но если он запускается в неанглийской системе, сообщение не будет английским, поэтому .Contains() не будет совпадать.
Есть ли какая-то подпись, которую яможно проверить или какой-то код исключения, который является глобальным и не меняется?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Специально для Исключений Сокетов вы можете получить код ошибки сокета через свойство SocketException.ErrorCode и включить его.Мне нравится использовать перечисленные здесь

Но в более широком смысле я думаю, что вы смотрите на это неправильно.Не существует «общего» или «общего» способа обработки исключений с помощью пользовательских полей.Посмотрите на это с точки зрения наследования, единственные поля, на которые вы можете рассчитывать, это те, которые унаследованы от Exception.Если вы имеете дело с классом, унаследованным от Exception, то для этого исключения вы должны кодировать , в частности .

Имейте в виду, что вы всегда можете использовать тип исключение для условной обработки:

try
{
...
}
catch(SocketException sockex)
{
...
}
catch(Exception ex)
{
...
}
0 голосов
/ 02 октября 2018

Вы можете отделить Исключение Сокета от любого другого исключения, например:

try
{
    // Your socket based code
}
catch (SocketException e) 
{
    // Handle Socket Exception
}
catch (Exception e) 
{
    // Handle Any other exception
}

Также вы можете проверить HResult свойство , чтобы увидеть, можете ли выполучить разные значения в зависимости от типа получаемой ошибки.

0 голосов
/ 02 октября 2018

Если вы используете try-catch правильно, то есть:

try
{
    ...
}
catch (SocketException ex) // this should have an s at the beginning...
{

}

Вы можете использовать функции Visual Studio, чтобы получить это (введите switch (ex.SocketErrorCode) и нажмите tab ):

switch (ex.SocketErrorCode)
{
    case SocketError.AccessDenied:
        break;
    case SocketError.AddressAlreadyInUse:
        break;
    case SocketError.AddressFamilyNotSupported:
        break;
    case SocketError.AddressNotAvailable:
        break;
    case SocketError.AlreadyInProgress:
        break;
    case SocketError.ConnectionAborted:
        break;
    case SocketError.ConnectionRefused:
        break;
    case SocketError.ConnectionReset:
        break;
    // some dozens more
    default:
        break;
}

Вы можете просмотреть документы , чтобы найти любые случаи, которые вы хотите контролировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...