7

コードはかなり単純です --- 問題は、groupPath 文字列に無効な文字 (正確には「/」) があることです。

私がやろうとしているのは(少なくともストップギャップとして)、cnを取得できないDirectoryEntriesをスキップすることです---理由に関係なく。

ただし、このコードを実行すると、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 アプリでこのプロバイダーを参照し、同じ入力でこの同じメソッドを呼び出すと、catch ブロックが想定どおりに動作します。これは、.NET 例外と COM 例外に関する提案された回答が正確ではないことを示唆していると思います。WebDevサーバーから実行したときにこのコードがキャッチされない理由を理解するのに途方に暮れていますが

4

5 に答える 5

13

何をキャッチするかを指定しない場合、デフォルトで.NET例外になります。例外はCOMにあり、.NETは例外をキャッチするように設定されていません。これに対処する最善の方法は、COM例外をキャッチすることです。これは次のようになります。

    try
    {

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

    }
    catch (System.Exception ex)
    {

    }
于 2009-05-22T16:53:45.033 に答える
3

次の 3 つの理由があります。

  1. ランタイムにバグがある
  2. アプリケーションやスレッドが、実行するコードの一部として終了しています
  3. 全体像が見えていない

個人的には 3 に投票します。数え切れないほどのデバッグ セッションがあり、コードの一部が例外を処理しないのはなぜかと思いました。捕まえたかどうか。

プログラムにデバッガーでの実行を継続するように要求して、catch ブロックで終了するかどうかを確認してみましたか?

また、Visual Studio の設定を確認し、[Debug] -> [Exceptions] ダイアログに移動して、[Thrown] チェックボックスがオンになっているかどうかを確認します。もしそうなら、それはあなたの問題かもしれません。

もちろん、実行時にこの問題が発生し、デバッガーが接続されていない場合は、上記のポイント 1 と 2 を除いてわかりません。

そしてもちろん、常にポイント 4 があります。未知のものです。

于 2009-05-22T19:53:39.680 に答える
2

その try ブロック内からスローされた COMException は、キャッチされ、catch ブロックによって飲み込まれます。

休憩を取り、コーヒーを飲み、"Logger.Error..." 行にブレークポイントを設定して、もう一度やり直してください。

于 2009-05-22T19:48:48.490 に答える
1

私も同様の問題を抱えていました。エラーが発生したVB6COMオブジェクトを呼び出していました。実際の例外タイプはSystem.Reflection.TargetInvocationExceptionであることが判明しました。innerExceptionがCOMExceptionに設定されました。System.Reflection.TargetInvocationExceptionをキャッチし、innerExceptionをチェックすることになりました

于 2009-07-27T21:36:35.800 に答える