Question

J'ai ma propre exception, qui lance une échec d'exécution d'une méthode (p / invoke dans mon cas).

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

Mais je veux le remplacer par déjà existant. Y at-il quelque chose comme ça dans FCL?

Était-ce utile?

La solution

Votre appelant va-t-il prendre différentes mesures selon que vous lançiez une exception PInvokeException ou une exception InvalidOperationException? Si tel est le cas, créez une exception PInvokeException personnalisée. Sinon, utilisez InvalidOperationException et un message d'erreur clair.

Voir Comment créer des hiérarchies d'exceptions .

Autres conseils

Rien n’est dédié aux appels PInvoke dans la BCL. Le plus proche qui existe est Marshal.GetExceptionForHR et Marshal.GetHRForLastWin32Error. Vous pouvez utiliser la combinaison de ces deux fonctions pour générer l'exception appropriée chaque fois qu'un appel PInvoke échoue.

Ex:

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

Il en existe un: Win32Exception .

Si la méthode à partir de laquelle vous générez une exception est une méthode .Net, vous devriez utiliser une exception personnalisée (ou existante, selon ce qui s'est passé).

Si vous appelez une méthode pour le compte de la personne qui appelle votre méthode (ou quelque chose qui concerne la réflexion - mais MethodInfo.Invoke le fait quand même), par exemple:

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

Vous devez utiliser le TargetInvocationException <> TargetInvocationException exception.

Si vous ne pouvez pas gérer l'exception, relisez-la ou ignorez-la.

Qu'en est-il de System.Runtime.InteropServices.ExternalException ?

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