J'ai des problèmes avec la gestion des exceptions. Plus précisément, je crée un objet System.Diagnostic.Process à partir de l'identificateur de processus (PID), puis je l'utilise pour exécuter mon algorithme. J'ai remarqué que cette classe lance une exception InvalidOperation et ArgumentException lors de l'accès à différentes propriétés, car le processus s'est déjà arrêté pendant que j'accède à l'instance de processus.Comment gérer correctement les exceptions système?
Cependant, l'algorithme utilise d'autres fonctions qui lancent les mêmes exceptions. Le code suivant est celui qui a soulevé le problème:
XmlWindow mWindow = new XmlWindow(new IntPtr(args.Message.GetContent<Int64>()));
Process mWindowProcess = mWindow.GetProcess();
XmlProcessInstance mWindowProcessInstance = null;
XmlProcessLayout pLayout = null;
Log(mWindow);
lock (mCoreData.ProcessList) {
try {
// Ensure matching XmlProcess
mCoreData.ProcessList.EnsureProcessManagement(mWindowProcess);
} catch (System.ComponentModel.Win32Exception eWin32Exception) {
sLog.WarnFormat("Unable to manage window creation ({0}, error code {1}).", eWin32Exception.Message, eWin32Exception.NativeErrorCode);
break;
}
}
lock (mCoreData.LayoutList) {
// Unmanaged process?
if (mCoreData.LayoutList.IsManagedProcessInstance(mWindowProcess) == false) {
lock (mCoreData.UnmanagedLayout) {
// Force process management
if ((mWindowProcessInstance = mCoreData.UnmanagedLayout.GetProcessInstance((uint)mWindowProcess.Id)) == null) {
mWindowProcessInstance = mCoreData.UnmanagedLayout.ManageProcessInstance((uint)mWindowProcess.Id, mCoreData.ProcessList);
sLog.DebugFormat("Layout \"{0}\" will manage explictly the process \"{1}\" ({2}).", mCoreData.UnmanagedLayout.Name, mWindowProcessInstance.ApplicationName, mWindowProcessInstance.InstanceId);
}
}
} else {
// Find the (managed) process instance
mWindowProcessInstance = mCoreData.LayoutList.GetProcessInstance((uint)mWindowProcess.Id);
}
}
Log(mWindowProcessInstance);
// Ensure window match
mWindowProcessInstance.ProcessAssociation.AssociatedItem.LearnWindowMatching(mWindow);
// Register process instance window
mWindowProcessInstance.LearnWindowTemplating(mWindow);
mWindowProcessInstance.Windows.Add(mWindow);
// Apply window template (if any)
mWindowProcessInstance.ApplyTemplateWindow(mWindow);
Le problème est de savoir comment gérer l'exception InvalidOperationException. Le code ci-dessus ne fonctionne pas, car l'exception peut être renvoyée par SomeFunction, en accédant à la instance de processus; Je dois gérer seulement les exceptions lancées par le mWindowProcess.
Bien sûr, je besoin d'un grand instruction try/catch, parce que l'utilisation de la variable mWindowProcess est très intense
Comment cela pourrait être résolu correctement?
Quel est le point de l'extra 'catch {throw; } '? AFAIK en omettant cela ne change pas le comportement du code. –
Le point ne corrige pas le code. Il s'agit de montrer qu'il peut y avoir deux déclarations d'essai. – Zafer