FCLには既にメソッドの実行が失敗することを意味する例外がありますか?

StackOverflow https://stackoverflow.com/questions/618661

  •  03-07-2019
  •  | 
  •  

質問

メソッドの実行失敗(私の場合はp / invoke)でスローされた独自の例外があります。

public PInvokeException(string methodName)
: base(String.Format(CultureInfo.CurrentCulture,
"An error occured while external method '{0}' call",
methodName)) { }

しかし、私はそれを既存のものに置き換えたいです。 FCLにはそのようなものがありますか?

役に立ちましたか?

解決

呼び出し元は、PInvokeExceptionとInvalidOperationExceptionのどちらをスローするかによって、異なるアクションを実行しますか?その場合、カスタムPInvokeExceptionを作成します。それ以外の場合は、InvalidOperationExceptionと明確なエラーメッセージを使用します。

例外階層の設計方法を参照してください。

他のヒント

BCLには、PInvoke呼び出し専用の機能はありません。最も近いものはMarshal.GetExceptionForHRとMarshal.GetHRForLastWin32Errorです。これら2つの関数の組み合わせを使用して、PInvoke呼び出しが失敗するたびに適切な例外をスローできます。

例:

throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());

Win32Exception

例外をスローするメソッドが.Netメソッドである場合、カスタム例外(または発生した内容に応じて既存の例外)を使用する必要があります。

メソッドを呼び出す人に代わってメソッドを呼び出す場合(またはリフレクションに関係することですが、とにかくMethodInfo.Invokeはそれを行います):

public void DoIt(Action action) { action(); }

TargetInvocationException 例外。

例外を処理できない場合は、例外を再スローするか、無視します。

System.Runtime.InteropServices.ExternalException はどうですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top