.net FrameWork怎樣對映HRESULT和異常
COM方法通過返回HRESULT報告錯誤;.NET方法通過引發異常來報告錯誤。執行時處理兩者之間的轉換。.NET Framework中的每個異常類都對映到一個HRESULT。
使用者定義的異常類可以指定任何適合的HRESULT。這些異常類可以通過在異常物件上設定HRESULT欄位來動態更改生成異常時返回的HRESULT。有關異常的其他資訊通過IErrorInfo介面提供給客戶端,該介面在非託管程序的.NET物件上實現。如果建立一個擴充套件System.Exception,必須在構造期間設定HRESULT欄位。否則,基類將分配HRESULT值。通過在異常的建構函式中提供值,可以將新的異常類對映到現有的HRESULT。
建立新的異常類並將其對映到HRESULT
使用以下程式碼建立一個名為NoAccessException的新異常類,並將其對映到HRESULT E_ACCESSDENIED。
Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows {throw new NoAccessException(); }
您可能會遇到同時使用託管和非託管程式碼的程式(任何程式語言)。例如,以下程式碼示例中的自定義封送拆收器使用。Marshal.ThrowExceptionForHR(int HResult)(int HResult)方法引發具有特定HResult值的異常。該方法查詢HRESULT並生成適當的異常型別。例如,以下程式碼片段中的HRESULT生成ArgumentException。
CMyClass::MethodThatThrows { Marshal.ThrowExceptionForHR(COR_E_ARGUMENT); }下表提供了從每個HRESULT到.NET Framework中可比較的異常類的完整對映。
HRESULT | .NET exception |
---|---|
MSEE_E_APPDOMAINUNLOADED | AppDomainUnloadedException |
COR_E_APPLICATION | ApplicationException |
COR_E_ARGUMENT or E_INVALIDARG | ArgumentException |
COR_E_ARGUMENTOUTOFRANGE | ArgumentOutOfRangeException |
COR_E_ARITHMETIC or ERROR_ARITHMETIC_OVERFLOW | ArithmeticException |
COR_E_ARRAYTYPEMISMATCH | ArrayTypeMismatchException |
COR_E_BADIMAGEFORMAT or ERROR_BAD_FORMAT | BadImageFormatException |
COR_E_COMEMULATE_ERROR | COMEmulateException |
COR_E_CONTEXTMARSHAL | ContextMarshalException |
COR_E_CORE | CoreException |
NTE_FAIL | CryptographicException |
COR_E_DIRECTORYNOTFOUND or ERROR_PATH_NOT_FOUND | DirectoryNotFoundException |
COR_E_DIVIDEBYZERO | DivideByZeroException |
COR_E_DUPLICATEWAITOBJECT | DuplicateWaitObjectException |
COR_E_ENDOFSTREAM | EndOfStreamException |
COR_E_TYPELOAD | EntryPointNotFoundException |
COR_E_EXCEPTION | Exception |
COR_E_EXECUTIONENGINE | ExecutionEngineException |
COR_E_FIELDACCESS | FieldAccessException |
COR_E_FILENOTFOUND or ERROR_FILE_NOT_FOUND | FileNotFoundException |
COR_E_FORMAT | FormatException |
COR_E_INDEXOUTOFRANGE | IndexOutOfRangeException |
COR_E_INVALIDCAST or E_NOINTERFACE | InvalidCastException |
COR_E_INVALIDCOMOBJECT | InvalidComObjectException |
COR_E_INVALIDFILTERCRITERIA | InvalidFilterCriteriaException |
COR_E_INVALIDOLEVARIANTTYPE | InvalidOleVariantTypeException |
COR_E_INVALIDOPERATION | InvalidOperationException |
COR_E_IO | IOException |
COR_E_MEMBERACCESS | AccessException |
COR_E_METHODACCESS | MethodAccessException |
COR_E_MISSINGFIELD | MissingFieldException |
COR_E_MISSINGMANIFESTRESOURCE | MissingManifestResourceException |
COR_E_MISSINGMEMBER | MissingMemberException |
COR_E_MISSINGMETHOD | MissingMethodException |
COR_E_MULTICASTNOTSUPPORTED | MulticastNotSupportedException |
COR_E_NOTFINITENUMBER | NotFiniteNumberException |
E_NOTIMPL | NotImplementedException |
COR_E_NOTSUPPORTED | NotSupportedException |
COR_E_NULLREFERENCE orE_POINTER | NullReferenceException |
COR_E_OUTOFMEMORY or E_OUTOFMEMORY |
OutOfMemoryException |
COR_E_OVERFLOW | OverflowException |
COR_E_PATHTOOLONG or ERROR_FILENAME_EXCED_RANGE | PathTooLongException |
COR_E_RANK | RankException |
COR_E_REFLECTIONTYPELOAD | ReflectionTypeLoadException |
COR_E_REMOTING | RemotingException |
COR_E_SAFEARRAYTYPEMISMATCH | SafeArrayTypeMismatchException |
COR_E_SECURITY | SecurityException |
COR_E_SERIALIZATION | SerializationException |
COR_E_STACKOVERFLOW orERROR_STACK_OVERFLOW | StackOverflowException |
COR_E_SYNCHRONIZATIONLOCK | SynchronizationLockException |
COR_E_SYSTEM | SystemException |
COR_E_TARGET | TargetException |
COR_E_TARGETINVOCATION | TargetInvocationException |
COR_E_TARGETPARAMCOUNT | TargetParameterCountException |
COR_E_THREADABORTED | ThreadAbortException |
COR_E_THREADINTERRUPTED | ThreadInterruptedException |
COR_E_THREADSTATE | ThreadStateException |
COR_E_THREADSTOP | ThreadStopException |
COR_E_TYPELOAD | TypeLoadException |
COR_E_TYPEINITIALIZATION | TypeInitializationException |
COR_E_VERIFICATION | VerificationException |
COR_E_WEAKREFERENCE | WeakReferenceException |
COR_E_VTABLECALLSNOTSUPPORTED | VTableCallsNotSupportedException |
All other HRESULTs | COMException |
要檢索擴充套件的錯誤資訊,託管客戶端必須檢查生成的異常物件的欄位。要使異常物件提供有關錯誤的有用資訊,COM物件必須實現IErrorInfo介面。執行時使用IErrorInfo提供的資訊初始化異常物件。如果COM物件不支援IErrorInfo,則執行時將使用預設值初始化異常物件。下表列出了與異常物件關聯的每個欄位,並標識了COM物件支援IErrorInfo時預設資訊的來源。
請注意,線上程上存在ierorrinfo的情況下,執行時有時會忽略HRESULT。在HRESULT和IErrorInfo不表示相同錯誤的情況下,可能會發生此行為。
Exception field | Source of Information from COM |
---|---|
ErrorCode | HRESULT returned from call. |
HelpLink | If IErrorInfo->HelpContext is nonzero, the string is formed by concatenating IErrorInfo->GetHelpFile and "#" and IErrorInfo->GetHelpContext. Otherwise the string is returned from IErrorInfo->GetHelpFile. |
InnerException | Always a null reference (Nothing in Visual Basic). |
Message | String returned from IErrorInfo->GetDescription. |
Source | String returned from IErrorInfo->GetSource. |
StackTrace | The stack trace. |
TargetSite | The name of the method that returned the failing HRESULT. |
異常欄位(如Message、Source和StackTrace)對於StackOverflowException不可用。