Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Metody COM zgłaszają błędy, zwracając kody HRESULT; metody platformy .NET zgłaszają je przez zgłaszanie wyjątków. Środowisko uruchomieniowe obsługuje przejście między nimi. Każdej klasie wyjątków w .NET odpowiada kod HRESULT.
Definiowane przez użytkownika klasy wyjątków mogą określać dowolny odpowiedni kod HRESULT. Te klasy wyjątków mogą dynamicznie zmieniać wartość HRESULT, która ma być zwracana po wygenerowaniu wyjątku, ustawiając HResult pole w obiekcie wyjątku. Dodatkowe informacje o wyjątku są udostępniane klientowi za pośrednictwem interfejsu IErrorInfo, który jest zaimplementowany w obiekcie .NET w procesie niezarządzanym.
Jeśli tworzysz klasę, która rozszerza System.Exceptionklasę , należy ustawić pole HRESULT podczas budowy. W przeciwnym razie klasa bazowa przypisuje wartość HRESULT. Nowe klasy wyjątków można mapować na istniejącą wartość HRESULT, przekazując tę wartość do konstruktora wyjątku.
Należy pamiętać, że środowisko uruchomieniowe czasami ignoruje element HRESULT w przypadkach, gdy w wątku znajduje się element IErrorInfo. To zachowanie może wystąpić w przypadkach, gdy element HRESULT i IErrorInfo nie reprezentuje tego samego błędu.
Aby utworzyć nową klasę wyjątku i przypisać ją do HRESULT
Użyj następującego kodu, aby utworzyć nową klasę wyjątków o nazwie
NoAccessExceptioni zamapować ją na HRESULTE_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 używa jednocześnie kodu zarządzanego i niezarządzanego. Na przykład niestandardowy marshaller w poniższym przykładzie kodu używa metody Marshal.ThrowExceptionForHR(int HResult) do zgłoszenia wyjątku z określoną wartością HRESULT. Metoda wyszukuje HRESULT i generuje odpowiedni typ wyjątku. Na przykład wartość HRESULT w poniższym fragmencie kodu generuje ArgumentException.
CMyClass::MethodThatThrows
{
Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}
W poniższej tabeli przedstawiono typowe mapowania z HRESULT na porównywalną klasę wyjątków w .NET. Wartości HRESULT bez jawnych mapowań są mapowane na COMException. Pełne, aktualne mapowanie można znaleźć w repozytorium dotnet/runtime.
| HRESULT | wyjątek .NET |
|---|---|
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT lub 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_DIRECTORYNOTFOUND or ERROR_PATH_NOT_FOUND |
DirectoryNotFoundException |
COR_E_DIVIDEBYZERO |
DivideByZeroException |
COR_E_DUPLICATEWAITOBJECT |
DuplicateWaitObjectException |
COR_E_ENDOFSTREAM |
EndOfStreamException |
COR_E_ENTRYPOINTNOTFOUND |
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_INVALIDFILTERCRITERIA |
InvalidFilterCriteriaException |
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_NOTFINITENUMBER |
NotFiniteNumberException |
E_NOTIMPL |
NotImplementedException |
COR_E_NOTSUPPORTED |
NotSupportedException |
COR_E_NULLREFERENCE orE_POINTER |
NullReferenceException |
COR_E_OUTOFMEMORY orE_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_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_THREADINTERRUPTED |
ThreadInterruptedException |
COR_E_THREADSTATE |
ThreadStateException |
COR_E_TYPELOAD |
TypeLoadException |
COR_E_TYPEINITIALIZATION |
TypeInitializationException |
COR_E_VERIFICATION |
VerificationException |
Aby pobrać rozszerzone informacje o błędzie, zarządzany klient musi zbadać pola wygenerowanego obiektu wyjątku. Aby obiekt wyjątku dostarczał przydatne informacje o błędzie, obiekt COM musi zaimplementować IErrorInfo interfejs. Środowisko uruchomieniowe używa informacji dostarczonych przez IErrorInfo do zainicjowania obiektu wyjątku.
Jeśli obiekt COM nie obsługuje IErrorInfo, środowisko uruchomieniowe inicjuje obiekt wyjątku z wartościami domyślnymi. Poniższa tabela wymienia wszystkie pola skojarzone z obiektem wyjątku i identyfikuje źródło domyślnych informacji, gdy obiekt COM obsługuje funkcję IErrorInfo.
Należy pamiętać, że środowisko uruchomieniowe czasami ignoruje element HRESULT w przypadkach, w których w wątku występuje IErrorInfo. To zachowanie może wystąpić w przypadkach, gdy element HRESULT i IErrorInfo nie reprezentuje tego samego błędu.
| Pole wyjątku | Źródło informacji z systemu COM |
|---|---|
ErrorCode |
Kod HRESULT zwrócony przez wywołanie. |
HelpLink |
Jeśli IErrorInfo->HelpContext jest nonzero, ciąg jest tworzony przez łączenie IErrorInfo->GetHelpFile i "#" i IErrorInfo->GetHelpContext. W przeciwnym razie ciąg jest zwracany z IErrorInfo->GetHelpFile. |
InnerException |
Zawsze odwołanie o wartości null (Nothing w Visual Basic). |
Message |
Ciąg zwrócony z IErrorInfo->GetDescription. |
Source |
Ciąg zwrócony z IErrorInfo->GetSource. |
StackTrace |
Ślad stosu. |
TargetSite |
Nazwa metody, która zwróciła kod HRESULT oznaczający błąd. |
Pola wyjątków, takie jak Message, Sourcei StackTrace nie są dostępne dla elementu StackOverflowException.