我遇到了異常處理問題。具體來說,我從進程標識符(PID)創建一個System.Diagnostic.Process對象,然後使用它來執行我的算法。我注意到這個類在訪問不同的屬性時拋出了InvalidOperation和ArgumentException異常,因爲當我訪問Process實例時,該進程已經退出。如何正確處理系統異常?
但是,該算法使用其他函數拋出相同的例外。下面的代碼是已提出的問題之一:
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);
的問題是如何管理InvalidOperationException異常。上面的代碼不起作用,因爲例外可能由SomeFunction引發,而不是通過訪問進程實例;我只需要處理由mWindowProcess引發的異常。
當然我需要一個大的try/catch語句,因爲變量mWindowProcess的使用是非常密集
這到底是怎麼正確解決?
額外的catch {throw {throw; }'? AFAIK省略,不會改變代碼的行爲。 – 2010-09-13 17:34:05
重點不在於糾正代碼。這是關於顯示可以有兩個try-catch語句。 – Zafer 2010-09-13 20:44:25