2009-05-22 2 views
7

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

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

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

Почему блок 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 приложение, и называют этот же метод с теми же входами подвох блок делает именно то, что он должен делать. Я думаю, это говорит о том, что предлагаемый ответ об исключениях .NET исключений из COM исключен. Хотя я не в порядке, чтобы понять, почему этот код не будет ловить при выполнении с сервера WebDev.

+4

в отладчике или в сборке? –

+0

В какой строке вы получаете исключение? И какой поток? –

+2

Также вы можете добавить исключение? (Exception.ToString()) –

ответ

13

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

try 
    { 

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

    } 
    catch (System.Exception ex) 
    { 

    } 
+0

COMException наследует ExternalException, наследует SystemException, наследует Exception. Если нет чего-то, чего я не хватает, это не должно быть в случае отсутствия улова, возможно, просто добавив его в System.Exception? –

+0

COMException может наследовать от System.Exception, но он все еще не попал в COM-взаимодействие с System.Exception. Я сделал много взаимодействия с AutoCAD, и это довольно сильно сбило меня с ума, так как я так привык использовать catch, вместо того, чтобы указывать свои точные исключения. – Noah

+0

woah держите телефон - вы серьезно !? Ясно, что вы, но это действительно удивительно и очень плохо! Это происходит для любых других типов ExternalException? – Rory

2

COMException выброшен из внутри этого блока Ьги будет пойман и поглощен блоком улова.

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

3

Там три причины:

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

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

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

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

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

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

2

Вдоль COMException есть также asynchronus исключения, которые НЕ поймано, такие как:

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

Уверены ли вы, что это не так?

+1

FYI, вы * можете * catch OutOfMemoryException. Если вы можете успешно освободить некоторую память в это время (релиз ссылки на вещи), зависит от вашего приложения. –

+0

Ну да, вы технически можете их поймать, но они будут сброшены в среду выполнения CLR, как только вы выйдете из блока catch дальше и дальше. –

1

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

Смежные вопросы