1. 程式人生 > 實用技巧 >.net FrameWork怎樣對映HRESULT和異常

.net FrameWork怎樣對映HRESULT和異常

COM方法通過返回HRESULT報告錯誤;.NET方法通過引發異常來報告錯誤。執行時處理兩者之間的轉換。.NET Framework中的每個異常類都對映到一個HRESULT。
使用者定義的異常類可以指定任何適合的HRESULT。這些異常類可以通過在異常物件上設定HRESULT欄位來動態更改生成異常時返回的HRESULT。有關異常的其他資訊通過IErrorInfo介面提供給客戶端,該介面在非託管程序的.NET物件上實現。如果建立一個擴充套件System.Exception,必須在構造期間設定HRESULT欄位。否則,基類將分配HRESULT值。通過在異常的建構函式中提供值,可以將新的異常類對映到現有的HRESULT。

請注意,線上程上存在IErrorInfo的情況下,執行時有時會忽略HRESULT。在HRESULT和IErrorInfo不表示相同錯誤的情況下,可能會發生此行為。

建立新的異常類並將其對映到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 fieldSource 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不可用。