Domanda

Ho la mia eccezione, che ha lanciato l'esecuzione non riesce di un metodo (p / invoke nel mio caso).

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

Ma voglio sostituirlo con già esistente. C'è in FCL qualcosa del genere?

È stato utile?

Soluzione

Il tuo interlocutore intraprenderà azioni diverse a seconda che tu lanci una PInvokeException rispetto a una InvalidOperationException? In tal caso, quindi creare una PInvokeException personalizzata. Altrimenti usa InvalidOperationException e un messaggio di errore chiaro.

Vedi Come progettare le gerarchie di eccezioni .

Altri suggerimenti

Non c'è nulla di dedicato alle chiamate PInvoke nel BCL. Il più vicino che esiste è Marshal.GetExceptionForHR e Marshal.GetHRForLastWin32Error. Puoi utilizzare la combinazione di queste due funzioni per generare l'eccezione appropriata ogni volta che una chiamata PInvoke fallisce.

Esempio:

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

Ce n'è uno: Win32Exception .

Se il metodo da cui stai generando un'eccezione è un metodo .Net che dovresti utilizzare un'eccezione personalizzata (o esistente, a seconda dell'accaduto).

Se chiami un metodo per conto della persona che chiama il tuo metodo (o qualcosa a che fare con la riflessione - ma MethodInfo.Invoke lo fa comunque), ad esempio:

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

È necessario utilizzare TargetInvocationException eccezione.

Se non riesci a gestire l'eccezione, riprovala o ignorala.

Che ne dici di System.Runtime.InteropServices.ExternalException ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top