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?
Réponses
Trop de publicités?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);
}
}
}
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
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.