82 votes

Pouvez-vous intercepter une exception native en code C #?

En code C #, pouvez-vous intercepter une exception native émise au fond d'une bibliothèque non gérée? Si c'est le cas, avez-vous besoin de faire quelque chose différemment pour l'attraper ou un essai standard ... attrape-t-il?

35voto

Vivek Points 7254

Vous pouvez utiliser Win32Exception et utiliser sa propriété NativeErrorCode pour la gérer correctement.

 // http://support.microsoft.com/kb/186550
const int ERROR_FILE_NOT_FOUND = 2;
const int ERROR_ACCESS_DENIED = 5;
const int ERROR_NO_APP_ASSOCIATED = 1155; 

void OpenFile(string filePath)
{
    Process process = new Process();

    try
    {
        // Calls native application registered for the file type
        // This may throw native exception
    	process.StartInfo.FileName = filePath;
    	process.StartInfo.Verb = "Open";
    	process.StartInfo.CreateNoWindow = true;
    	process.Start();
    }
    catch (Win32Exception e)
    {
    	if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND || 
    		e.NativeErrorCode == ERROR_ACCESS_DENIED ||
    		e.NativeErrorCode == ERROR_NO_APP_ASSOCIATED)
    	{
    		MessageBox.Show(this, e.Message, "Error", 
    				MessageBoxButtons.OK, 
    				MessageBoxIcon.Exclamation);
    	}
    }
}
 

19voto

trampster Points 3310

Catch without () interceptera les exceptions non conformes à CLS, y compris les exceptions natives.

 try
{

}
catch
{

}
 

Consultez la règle FxCop suivante pour plus d'informations http://msdn.microsoft.com/en-gb/bb264489.aspx

11voto

Curt Hagenlocher Points 12432

La couche d'interopérabilité entre C # et le code natif convertira l'exception en un formulaire géré, ce qui lui permettra d'être capturée par votre code C #. A partir de .NET 2.0, catch (Exception) devrait capturer autre chose qu'une erreur irrécupérable.

5voto

Michael Damatov Points 5453

Quelque part en utilisant un .NET Reflector, j'ai vu le code suivant:

 try {
  ...
} catch(Exception e) {
  ...
} catch {
  ...
}
 

Hmm, C # ne permet pas de lever une exception ne dérivant pas de la classe System.Exception. Et pour autant que je sache, les exceptions cautch du marshaller interop sont encapsulées par la classe des exceptions qui hérite de System.Exception.

Ma question est donc de savoir s'il est possible d'attraper une exception qui n'est pas une exception System.Exception.

-2voto

Mitchel Sellers Points 38352

Si vous utilisez un

 try
{

}
catch(Exception ex)
{

}
 

il interceptera TOUTES les exceptions. En fonction de la façon dont vous appelez les bibliothèques externes, vous obtiendrez peut-être une exception liée à com qui encapsulera l'erreur, mais qui interceptera l'erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X