aliwpf Ответов: 2

Как мне поймать внутреннее исключение перед базовым исключением ?


Привет. я пишу следующий код :
catch (SocketException se)
            {
                if (se.SocketErrorCode == SocketError.TimedOut)
                {
                    //my logic
                }
            }
            catch (WebException we)
            {

            }

и хотите, чтобы поймать исключение гнездо первого(в свойство innerexception исключения webexception в моем состоянии).
но этого не происходит. как это сделать без внутреннего блока WebException?
спасибо

Что я уже пробовал:

catch (SocketException se)
            {
                if (se.SocketErrorCode == SocketError.TimedOut)
                {
                    //my logic
                }
            }
            catch (WebException we)
            {

            }

2 Ответов

Рейтинг:
15

Richard Deeming

Если вы используете C# 6 (Visual Studio 2015 или более поздняя версия), вы можете использовать фильтр исключений:

catch (WebException we) when (we.InnerException is SocketException)
{
    var se = (SocketException)we.InnerException;
    if (se.SocketErrorCode == SocketError.TimedOut)
    {
        ...
    }
}
catch (WebException we)
{
    ...
}


Если вы используете C# 7 (Visual Studio 2017), вы можете упростить это, объединив фильтр исключений с сопоставлением шаблонов:
catch (WebException we) when (we.InnerException is SocketException se)
{
    if (se.SocketErrorCode == SocketError.TimedOut)
    {
        ...
    }
}
catch (WebException we)
{
    ...
}

Или даже:
catch (WebException we) when (we.InnerException is SocketException se && se.SocketErrorCode == SocketError.TimedOut)
{
    ...
}
catch (WebException we)
{
    ...
}


В более ранних версиях C# не поддерживал фильтры исключений. У вас не будет другого выбора, кроме как поймать внешнее исключение и проверить внутреннее исключение:
catch (WebException we)
{
    var se = we.InnerException as SocketException;
    if (se != null)
    {
        if (se.SocketErrorCode == SocketError.TimedOut)
        {
            ...
        }
    }
    else
    {
        ...
    }
}


aliwpf

спасибо

Рейтинг:
1

RickZeeland

Воспользуйся Try ... Catch (Exception e) чтобы поймать все управляемые исключения.
Или вы можете попробовать использовать пустой Try .. Catch, без чего-либо после Catch Таким образом, вы также можете ловить неуправляемые исключения.
Если код недоступен для отладки, прочтите эту статью CodeProject: Система.Диагностика Полезные Действия[^]