Question

Le code est assez simple --- la question est qu'il ya un caractère non valide dans la chaîne de groupPath (un « / » pour être exact).

Ce que je suis en train de faire (au moins un espace d'arrêt) est ignoreront DirectoryEntries que je ne peux pas obtenir le cn pour --- quelle que soit la raison.

Cependant quand je lance ce code, le bloc catch ne fonctionne pas et je reçois à la place: Le serveur ne fonctionne pas. et une System.Runtime.InteropServices.COMException non gérée.

Pourquoi le bloc catch ne pas attraper cette exception.

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");
}

Observations supplémentaires: Le code est en fait dans un RoleProvider personnalisé, et la chose curieuse est que si je fais référence, ce fournisseur dans une application simple WinForms et appeler cette même méthode avec les mêmes entrées du bloc catch fait exactement ce qu'il est supposé faire. Je pense que cela suggère que la réponse proposée concernant les exceptions .NET par rapport à des exceptions COM ne sont pas exactes. Bien que je suis à une perte de comprendre pourquoi ce code ne serait pas attraper lorsqu'il est exécuté à partir du serveur WebDev

Était-ce utile?

La solution

Lorsque vous ne spécifiez pas quoi attraper, il est par défaut à .NET exceptions. Votre exception est COM où .NET n'est pas réglé pour attraper l'exception. La meilleure façon de traiter ce problème est d'attraper l'exception COM, qui devrait ressembler à ceci:

    try
    {

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

    }
    catch (System.Exception ex)
    {

    }

Autres conseils

Il y a trois raisons:

  1. Il y a un bug dans le moteur d'exécution
  2. L'application et / ou du fil se termine dans le cadre d'une partie du code qui exécute
  3. Vous ne voyez pas l'image entière

Personnellement, je vote pour 3, et je l'ai eu d'innombrables séances de mise au point où je me demande pourquoi un morceau de code gère pas mes exceptions, alors qu'en fait il était Visual Studio qui a été configuré pour arrêter sur toutes les exceptions lancées, quel que soit qu'ils ont été pris ou non.

Avez-vous essayé simplement demander au programme de continuer à fonctionner dans le débogueur et voir si elle se termine alors dans le bloc catch?

En outre, vérifiez le paramètre dans Visual Studio, accédez à la boîte de dialogue Exceptions Debug->, et vérifiez si vous avez l'une des cases cochées Jeté. Si vous avez, cela pourrait être votre problème.

Bien sûr, si vous voyez ce problème lors de l'exécution, aucun débogueur attaché, alors je ne sais pas, à l'exception des points 1 et 2 ci-dessus.

Et bien sûr, il y a toujours le point 4:. L'inconnu

Un COMException jeté à l'intérieur de ce bloc d'essai sera pris et avalé par le bloc catch.

Faites une pause, procurez-vous un café, mettre un point d'arrêt sur la ligne « Logger.Error ... » et essayez à nouveau.

En COMException il y a aussi asynchronus exceptions NE PAS Laissez-vous emporter par exemple:

  • OutOfMemoryException
  • StackOverflowException (non, ce n'est pas une blague liée à ce site :))
  • ThreadAbortException

Êtes-vous sûr que ce pas le cas?

J'ai eu un problème similaire. J'invoquait un objet COM VB6 qui a soulevé une erreur. Le type d'exception réelle avéré être System.Reflection.TargetInvocationException. Le innerException a été mis à la COMException. J'ai fini par attraper le System.Reflection.TargetInvocationException et vérifier la innerException

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top