Почему бы это поймать весь блок на самом деле не поймать все - PullRequest
7 голосов
/ 22 мая 2009

Код довольно прост - проблема в том, что в строке groupPath есть недопустимый символ (точнее, '/').

То, что я пытаюсь сделать (по крайней мере, в качестве пробела), - это пропустить каталог DirectoryEntries, для которого я не могу получить cn - независимо от того, почему.

Однако, когда я запускаю этот код, блок catch не запускается, а вместо этого я получаю: Сервер не работает. и необработанное исключение System.Runtime.InteropServices.COME.

Почему блок catch не может поймать это исключение.

try
{
    using (DirectoryEntry groupBinding = new DirectoryEntry("LDAP://" + groupPath))
    {
        using (DirectorySearcher groupSearch = new DirectorySearcher(groupBinding))
        {

            using (DirectoryEntry groupEntry = groupSearch.FindOne().GetDirectoryEntry())
            {
                results.Add(string.Format("{0}", groupEntry.Properties["cn"].Value.ToString()));
            }
        }
    }
}
catch
{
    Logger.Error("User has bad roles");
}

Дополнительные наблюдения: Код на самом деле находится в собственном RoleProvider, и любопытно, что если я ссылаюсь на этого провайдера в простом приложении winforms и вызываю этот же метод с теми же входными данными, то блок catch делает именно то, что должен делать. Я думаю, это говорит о том, что предлагаемый ответ относительно исключений .NET по сравнению с исключениями COM не является точным. Хотя я затрудняюсь понять, почему этот код не будет перехвачен при выполнении с сервера WebDev

Ответы [ 5 ]

13 голосов
/ 22 мая 2009

Если вы не указываете, что ловить, по умолчанию используются исключения .NET. Ваше исключение находится в COM, где .NET не настроен на его перехват. Лучший способ справиться с этим - перехватить исключение COM, которое должно выглядеть примерно так:

    try
    {

    }
    catch (System.Runtime.InteropServices.COMException COMex)
    {

    }
    catch (System.Exception ex)
    {

    }
3 голосов
/ 22 мая 2009

Есть три причины:

  1. Во время выполнения есть ошибка
  2. Приложение и / или поток завершается как часть некоторого кода, который выполняет
  3. Вы не видите всю картину

Лично я голосую за 3, и у меня было бесчисленное множество сессий отладки, где я удивляюсь, почему какой-то фрагмент кода не обрабатывает мои исключения, хотя на самом деле это была Visual Studio, которая была настроена для остановки на всех сгенерированных исключениях, независимо от были ли они пойманы или нет.

Вы пытались просто попросить программу продолжить работу в отладчике и посмотреть, не окажется ли она затем в блоке catch?

Кроме того, проверьте настройки в Visual Studio, перейдите в диалоговое окно «Отладка -> Исключения» и проверьте, установлен ли какой-либо из флажков «Брошенный». Если да, то это может быть вашей проблемой.

Конечно, если вы видите эту проблему во время выполнения, отладчик не подключен, тогда я понятия не имею, за исключением пункта 1 и 2 выше.

И, конечно, всегда есть пункт 4: неизвестность.

2 голосов
/ 23 мая 2009

Вдоль COMException также существуют асинхронные исключения, которые НЕ попадают, такие как:

  • OutOfMemoryException
  • StackoverflowException (нет, это не шутка, связанная с этим сайтом :))
  • ThreadAbortException

Вы уверены, что это не так?

2 голосов
/ 22 мая 2009

COMException, генерируемый из этого блока try, будет перехвачен блоком catch.

Сделайте перерыв, выпейте кофе, поставьте точку останова в строке «Logger.Error ...» и попробуйте снова.

1 голос
/ 28 июля 2009

У меня была похожая проблема. Я вызывал COM-объект VB6, который вызвал ошибку. Фактическим типом исключения оказался System.Reflection.TargetInvocationException. Внутреннее исключение было установлено на COMException. В итоге я перехватил исключение System.Reflection.TargetInvocationException и проверил innerException

...