1

例外と、COM 呼び出し元に制御を返すことについて質問があります。以下は、カスタム例外クラスを使用したテスト問題です。違いは何ですか

Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);

throw new CustomException("Argument is out of bounds");

1) と 2 が int と Exception-object を返すため機能しない理由がわかりました。しかし、3と4の違いは何ですか?

public class CustomException : ApplicationException
{
   public static int COR_E_ARGUMENT = unchecked((int)0x80070057);
   public CustomException(string msg)
      : base(msg)
   {
      HResult = COR_E_ARGUMENT;
   }
}

CustomException クラスを使用して制御を COM 呼び出し元にすぐに返すコード セグメントを記述する必要があります。また、呼び出し元がエラー コードにアクセスできることを確認する必要があります。どのコード セグメントを使用する必要がありますか?

  1. return Marshal.GetExceptionForHR(CustomException.COR_E_ARGUMENT);
  2. CustomException.COR_E_ARGUMENT を返します。
  3. Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);
  4. throw new CustomException("引数が範囲外です"); // 正解
4

1 に答える 1

3

もちろん、COM クライアント コードは .NET 例外の種類に完全に依存せず、HRESULT エラー コードのみを認識します。したがって、独自の例外タイプを追加しても付加価値はありません。

すべての標準 .NET Exception 派生クラスには、事前に調理された HRESULT 値が既に組み込まれています。コンストラクターで Exception.HResult プロパティを割り当てます。E_INVALIDARG (0x80070057) を生成する場合は、そのエラー コードを既に使用している標準の .NET 例外クラスを使用します。System.ArgumentException.

于 2013-07-13T13:22:14.820 に答える