Porady: mapowanie wyników HRESULT i wyjątkówHow to: Map HRESULTs and Exceptions

Metody COM zgłaszają błędy, zwracając wartości HRESULT; metody .NET raportują je przez wyrzucanie wyjątków.COM methods report errors by returning HRESULTs; .NET methods report them by throwing exceptions. Środowisko uruchomieniowe obsługuje przejście między nimi.The runtime handles the transition between the two. Każda Klasa wyjątków w .NET Framework jest mapowana na wartość HRESULT.Each exception class in the .NET Framework maps to an HRESULT.

Klasy wyjątków zdefiniowane przez użytkownika mogą określać wszelkie wartości HRESULT są odpowiednie.User-defined exception classes can specify whatever HRESULT is appropriate. Te klasy wyjątków mogą dynamicznie zmieniać wynik HRESULT, który ma zostać zwrócony, gdy wyjątek jest generowany przez ustawienie pola HRESULT dla obiektu Exception.These exception classes can dynamically change the HRESULT to be returned when the exception is generated by setting the HResult field on the exception object. Dodatkowe informacje o wyjątku są udostępniane klientowi za pomocą interfejsu IErrorInfo , który jest implementowany w obiekcie .NET w procesie niezarządzanym.Additional information about the exception is provided to the client through the IErrorInfo interface, which is implemented on the .NET object in the unmanaged process.

W przypadku utworzenia klasy rozszerzającej System. Exceptionnależy ustawić pole HRESULT podczas konstruowania.If you create a class that extends System.Exception, you must set the HRESULT field during construction. W przeciwnym razie Klasa bazowa przypisuje wartość HRESULT.Otherwise, the base class assigns the HRESULT value. Można mapować nowe klasy wyjątków do istniejącego HRESULT, dostarczając wartość w konstruktorze wyjątku.You can map new exception classes to an existing HRESULT by supplying the value in the exception's constructor.

Należy pamiętać, że środowisko uruchomieniowe czasami ignoruje HRESULT w przypadkach, gdy istnieje IErrorInfo w wątku.Note that the runtime will sometimes ignore an HRESULT in cases where there is an IErrorInfo present on the thread. Takie zachowanie może wystąpić w przypadkach, gdy HRESULT i IErrorInfo nie reprezentują tego samego błędu.This behavior can occur in cases where the HRESULT and the IErrorInfo do not represent the same error.

Aby utworzyć nową klasę wyjątku i zamapować ją na HRESULTTo create a new exception class and map it to an HRESULT

  1. Użyj poniższego kodu, aby utworzyć nową klasę wyjątku o nazwie NoAccessException i zamapować ją na E_ACCESSDENIEDHRESULT.Use the following code to create a new exception class called NoAccessException and map it to the HRESULT E_ACCESSDENIED.

    Class NoAccessException : public ApplicationException  
    {  
        NoAccessException () {  
        HResult = E_ACCESSDENIED;   
    }  
    }  
    CMyClass::MethodThatThrows  
    {  
    throw new NoAccessException();  
    }  
    

Może wystąpić program (w dowolnym języku programowania), który jednocześnie używa kodu zarządzanego i niezarządzanego.You might encounter a program (in any programming language) that uses both managed and unmanaged code at the same time. Na przykład niestandardowy Organizator w poniższym przykładzie kodu używa metody Marshal. ThrowExceptionForHR (int HRESULT) , aby zgłosić wyjątek z określoną wartością HRESULT.For example, the custom marshaler in the following code example uses the Marshal.ThrowExceptionForHR(int HResult) method to throw an exception with a specific HRESULT value. Metoda wyszukuje wynik HRESULT i generuje odpowiedni typ wyjątku.The method looks up the HRESULT and generates the appropriate exception type. Na przykład wynik HRESULT w poniższym fragmencie kodu generuje ArgumentException.For example, the HRESULT in the following code fragment generates ArgumentException.

CMyClass::MethodThatThrows  
{  
    Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);  
}  

Poniższa tabela zawiera pełne mapowanie z każdego wyniku HRESULT do jego porównywalnej klasy wyjątku w .NET Framework.The following table provides the complete mapping from each HRESULT to its comparable exception class in the .NET Framework.

HRESULTHRESULT Wyjątek platformy .NET.NET exception
MSEE_E_APPDOMAINUNLOADEDMSEE_E_APPDOMAINUNLOADED AppDomainUnloadedException —AppDomainUnloadedException
COR_E_APPLICATIONCOR_E_APPLICATION ApplicationExceptionApplicationException
COR_E_ARGUMENT lub E_INVALIDARGCOR_E_ARGUMENT or E_INVALIDARG ArgumentExceptionArgumentException
COR_E_ARGUMENTOUTOFRANGECOR_E_ARGUMENTOUTOFRANGE Wyjątku ArgumentOutOfRangeExceptionArgumentOutOfRangeException
COR_E_ARITHMETIC lub ERROR_ARITHMETIC_OVERFLOWCOR_E_ARITHMETIC or ERROR_ARITHMETIC_OVERFLOW ArithmeticException —ArithmeticException
COR_E_ARRAYTYPEMISMATCHCOR_E_ARRAYTYPEMISMATCH ArrayTypeMismatchExceptionArrayTypeMismatchException
COR_E_BADIMAGEFORMAT lub ERROR_BAD_FORMATCOR_E_BADIMAGEFORMAT or ERROR_BAD_FORMAT BadImageFormatExceptionBadImageFormatException
COR_E_COMEMULATE_ERRORCOR_E_COMEMULATE_ERROR COMEmulateExceptionCOMEmulateException
COR_E_CONTEXTMARSHALCOR_E_CONTEXTMARSHAL ContextMarshalExceptionContextMarshalException
COR_E_CORECOR_E_CORE RdzeńexceptionCoreException
NTE_FAILNTE_FAIL CryptographicExceptionCryptographicException
COR_E_DIRECTORYNOTFOUND lub ERROR_PATH_NOT_FOUNDCOR_E_DIRECTORYNOTFOUND or ERROR_PATH_NOT_FOUND DirectoryNotFoundExceptionDirectoryNotFoundException
COR_E_DIVIDEBYZEROCOR_E_DIVIDEBYZERO DivideByZeroExceptionDivideByZeroException
COR_E_DUPLICATEWAITOBJECTCOR_E_DUPLICATEWAITOBJECT DuplicateWaitObjectExceptionDuplicateWaitObjectException
COR_E_ENDOFSTREAMCOR_E_ENDOFSTREAM EndOfStreamExceptionEndOfStreamException
COR_E_TYPELOADCOR_E_TYPELOAD EntryPointNotFoundException —EntryPointNotFoundException
COR_E_EXCEPTIONCOR_E_EXCEPTION OpróczException
COR_E_EXECUTIONENGINECOR_E_EXECUTIONENGINE ExecutionEngineExceptionExecutionEngineException
COR_E_FIELDACCESSCOR_E_FIELDACCESS FieldAccessExceptionFieldAccessException
COR_E_FILENOTFOUND lub ERROR_FILE_NOT_FOUNDCOR_E_FILENOTFOUND or ERROR_FILE_NOT_FOUND FileNotFoundExceptionFileNotFoundException
COR_E_FORMATCOR_E_FORMAT FormatExceptionFormatException
COR_E_INDEXOUTOFRANGECOR_E_INDEXOUTOFRANGE IndexOutOfRangeExceptionIndexOutOfRangeException
COR_E_INVALIDCAST lub E_NOINTERFACECOR_E_INVALIDCAST or E_NOINTERFACE InvalidCastExceptionInvalidCastException
COR_E_INVALIDCOMOBJECTCOR_E_INVALIDCOMOBJECT InvalidComObjectException —InvalidComObjectException
COR_E_INVALIDFILTERCRITERIACOR_E_INVALIDFILTERCRITERIA InvalidFilterCriteriaException —InvalidFilterCriteriaException
COR_E_INVALIDOLEVARIANTTYPECOR_E_INVALIDOLEVARIANTTYPE InvalidOleVariantTypeException —InvalidOleVariantTypeException
COR_E_INVALIDOPERATIONCOR_E_INVALIDOPERATION InvalidOperationExceptionInvalidOperationException
COR_E_IOCOR_E_IO IOExceptionIOException
COR_E_MEMBERACCESSCOR_E_MEMBERACCESS AccessexceptionAccessException
COR_E_METHODACCESSCOR_E_METHODACCESS MethodAccessExceptionMethodAccessException
COR_E_MISSINGFIELDCOR_E_MISSINGFIELD MissingFieldExceptionMissingFieldException
COR_E_MISSINGMANIFESTRESOURCECOR_E_MISSINGMANIFESTRESOURCE MissingManifestResourceExceptionMissingManifestResourceException
COR_E_MISSINGMEMBERCOR_E_MISSINGMEMBER MissingMemberExceptionMissingMemberException
COR_E_MISSINGMETHODCOR_E_MISSINGMETHOD MissingMethodExceptionMissingMethodException
COR_E_MULTICASTNOTSUPPORTEDCOR_E_MULTICASTNOTSUPPORTED MulticastNotSupportedException —MulticastNotSupportedException
COR_E_NOTFINITENUMBERCOR_E_NOTFINITENUMBER NotFiniteNumberException —NotFiniteNumberException
E_NOTIMPLE_NOTIMPL NotImplementedExceptionNotImplementedException
COR_E_NOTSUPPORTEDCOR_E_NOTSUPPORTED NotSupportedExceptionNotSupportedException
COR_E_NULLREFERENCE orE_POINTERCOR_E_NULLREFERENCE orE_POINTER NullReferenceExceptionNullReferenceException
COR_E_OUTOFMEMORY lubCOR_E_OUTOFMEMORY or

E_OUTOFMEMORYE_OUTOFMEMORY
OutOfMemoryExceptionOutOfMemoryException
COR_E_OVERFLOWCOR_E_OVERFLOW OverflowExceptionOverflowException
COR_E_PATHTOOLONG lub ERROR_FILENAME_EXCED_RANGECOR_E_PATHTOOLONG or ERROR_FILENAME_EXCED_RANGE PathTooLongExceptionPathTooLongException
COR_E_RANKCOR_E_RANK RankExceptionRankException
COR_E_REFLECTIONTYPELOADCOR_E_REFLECTIONTYPELOAD ReflectionTypeLoadExceptionReflectionTypeLoadException
COR_E_REMOTINGCOR_E_REMOTING RemotingException —RemotingException
COR_E_SAFEARRAYTYPEMISMATCHCOR_E_SAFEARRAYTYPEMISMATCH SafeArrayTypeMismatchException —SafeArrayTypeMismatchException
COR_E_SECURITYCOR_E_SECURITY SecurityExceptionSecurityException
COR_E_SERIALIZATIONCOR_E_SERIALIZATION SerializationExceptionSerializationException
COR_E_STACKOVERFLOW orERROR_STACK_OVERFLOWCOR_E_STACKOVERFLOW orERROR_STACK_OVERFLOW StackOverflowExceptionStackOverflowException
COR_E_SYNCHRONIZATIONLOCKCOR_E_SYNCHRONIZATIONLOCK SynchronizationLockException —SynchronizationLockException
COR_E_SYSTEMCOR_E_SYSTEM SystemExceptionSystemException
COR_E_TARGETCOR_E_TARGET TargetException —TargetException
COR_E_TARGETINVOCATIONCOR_E_TARGETINVOCATION TargetInvocationException —TargetInvocationException
COR_E_TARGETPARAMCOUNTCOR_E_TARGETPARAMCOUNT TargetParameterCountException —TargetParameterCountException
COR_E_THREADABORTEDCOR_E_THREADABORTED ThreadAbortExceptionThreadAbortException
COR_E_THREADINTERRUPTEDCOR_E_THREADINTERRUPTED ThreadInterruptedException —ThreadInterruptedException
COR_E_THREADSTATECOR_E_THREADSTATE ThreadStateException —ThreadStateException
COR_E_THREADSTOPCOR_E_THREADSTOP ThreadStopExceptionThreadStopException
COR_E_TYPELOADCOR_E_TYPELOAD TypeLoadExceptionTypeLoadException
COR_E_TYPEINITIALIZATIONCOR_E_TYPEINITIALIZATION TypeInitializationExceptionTypeInitializationException
COR_E_VERIFICATIONCOR_E_VERIFICATION VerificationExceptionVerificationException
COR_E_WEAKREFERENCECOR_E_WEAKREFERENCE WeakReferenceExceptionWeakReferenceException
COR_E_VTABLECALLSNOTSUPPORTEDCOR_E_VTABLECALLSNOTSUPPORTED VTableCallsNotSupportedExceptionVTableCallsNotSupportedException
Wszystkie inne HRESULTAll other HRESULTs COMExceptionCOMException

Aby pobrać rozszerzone informacje o błędzie, zarządzany klient musi przejrzeć pola wygenerowanego obiektu wyjątku.To retrieve extended error information, the managed client must examine the fields of the exception object that was generated. Aby obiekt wyjątku dostarczał przydatne informacje o błędzie, obiekt COM musi implementować interfejs IErrorInfo .For the exception object to provide useful information about an error, the COM object must implement the IErrorInfo interface. Środowisko uruchomieniowe używa informacji dostarczonych przez IErrorInfo do zainicjowania obiektu wyjątku.The runtime uses the information provided by IErrorInfo to initialize the exception object.

Jeśli obiekt COM nie obsługuje IErrorInfo, środowisko uruchomieniowe inicjuje obiekt wyjątku z wartościami domyślnymi.If the COM object does not support IErrorInfo, the runtime initializes an exception object with default values. Poniższa tabela zawiera listę wszystkich pól skojarzonych z obiektem wyjątku i identyfikuje źródło informacji domyślnych, gdy obiekt COM obsługuje IErrorInfo.The following table lists each field associated with an exception object and identifies the source of default information when the COM object supports IErrorInfo.

Należy pamiętać, że środowisko uruchomieniowe czasami ignoruje HRESULT w przypadkach, gdy istnieje IErrorInfo w wątku.Note that the runtime will sometimes ignore an HRESULT in cases where there is an IErrorInfo present on the thread. Takie zachowanie może wystąpić w przypadkach, gdy HRESULT i IErrorInfo nie reprezentują tego samego błędu.This behavior can occur in cases where the HRESULT and the IErrorInfo do not represent the same error.

Pole wyjątkuException field Źródło informacji z modelu COMSource of Information from COM
KodzieErrorCode WYNIK HRESULT został zwrócony z wywołania.HRESULT returned from call.
HelpLinkHelpLink Jeśli IErrorInfo-> atrybut HelpContext jest różna od zera, ciąg jest tworzony przez złączenie IErrorInfo-> GetHelpFile i "#" oraz IErrorInfo-> GetHelpContext.If IErrorInfo->HelpContext is nonzero, the string is formed by concatenating IErrorInfo->GetHelpFile and "#" and IErrorInfo->GetHelpContext. W przeciwnym razie ciąg jest zwracany z IErrorInfo-> GetHelpFile.Otherwise the string is returned from IErrorInfo->GetHelpFile.
InnerExceptionInnerException Zawsze ma odwołanie o wartości null (Nothing w Visual Basic).Always a null reference (Nothing in Visual Basic).
KomunikatMessage Ciąg zwrócony z IErrorInfo-> GetDescription.String returned from IErrorInfo->GetDescription.
ZewnętrzSource Ciąg zwrócony z IErrorInfo-> GetSource.String returned from IErrorInfo->GetSource.
Ślad stosuStackTrace Ślad stosu.The stack trace.
TargetSiteTargetSite Nazwa metody, która zwróciła błąd HRESULT.The name of the method that returned the failing HRESULT.

Pola wyjątków, takie jak Message, Sourcei ślad stosu , nie są dostępne dla StackOverflowException.Exception fields, such as Message, Source, and StackTrace are not available for the StackOverflowException.

Zobacz takżeSee also