Nasıl yapılır: HRESULTs ve Özel Durumları Eşleme
COM yöntemleri HRESULTs döndürerek hataları bildirir; .NET yöntemleri özel durumlar oluşturarak bunları bildirir. Çalışma zamanı ikisi arasındaki geçişi işler. .NET Framework'teki her özel durum sınıfı bir HRESULT ile eşlenir.
Kullanıcı tanımlı özel durum sınıfları, HRESULT'un uygun olduğu her şeyi belirtebilir. Bu özel durum sınıfları, özel durum nesnesinde alanı ayarlayarak HResult
özel durum oluşturulduğunda döndürülecek HRESULT değerini dinamik olarak değiştirebilir. Özel durum hakkında ek bilgiler, yönetilmeyen işlemdeki IErrorInfo
.NET nesnesine uygulanan arabirim aracılığıyla istemciye sağlanır.
genişleten System.Exception
bir sınıf oluşturursanız, inşaat sırasında HRESULT alanını ayarlamanız gerekir. Aksi takdirde, temel sınıf HRESULT değerini atar. Özel durumun oluşturucusunda değeri sağlayarak yeni özel durum sınıflarını mevcut bir HRESULT ile eşleyebilirsiniz.
Çalışma zamanının bazen iş parçacığında mevcut olduğu durumlarda bir IErrorInfo
öğesini yoksayacağını HRESULT
unutmayın. Bu davranış, ve değerlerinin HRESULT
IErrorInfo
aynı hatayı temsil etmemesi durumunda ortaya çıkabilir.
Yeni bir özel durum sınıfı oluşturmak ve bunu bir HRESULT ile eşlemek için
adlı
NoAccessException
yeni bir özel durum sınıfı oluşturmak ve bunu HRESULTE_ACCESSDENIED
ile eşlemek için aşağıdaki kodu kullanın.Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }
Aynı anda hem yönetilen hem de yönetilmeyen kod kullanan bir programla (herhangi bir programlama dilinde) karşılaşabilirsiniz. Örneğin, aşağıdaki kod örneğindeki özel marshaller, yöntemini kullanarak Marshal.ThrowExceptionForHR(int HResult)
belirli bir HRESULT değerine sahip bir özel durum oluşturur. yöntemi HRESULT'yi arar ve uygun özel durum türünü oluşturur. Örneğin, aşağıdaki kod parçasındaki HRESULT oluşturur ArgumentException
.
CMyClass::MethodThatThrows
{
Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}
Aşağıdaki tabloda HRESULT'tan .NET'teki benzer özel durum sınıfına ortak eşlemeler sağlanmaktadır. Açık eşlemeleri olmayan HRESULT değerleri ile COMException
eşlenir. Tam güncel eşleme dotnet/runtime deposunda bulunabilir.
HRESULT | .NET özel durumu |
---|---|
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT veya 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 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_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 |
Genişletilmiş hata bilgilerini almak için yönetilen istemcinin oluşturulan özel durum nesnesinin alanlarını incelemesi gerekir. Özel durum nesnesinin bir hata hakkında yararlı bilgiler sağlaması için COM nesnesinin arabirimi uygulaması IErrorInfo
gerekir. Çalışma zamanı, özel durum nesnesini başlatmak için tarafından IErrorInfo
sağlanan bilgileri kullanır.
COM nesnesi desteklemiyorsa IErrorInfo
, çalışma zamanı varsayılan değerlerle bir özel durum nesnesi başlatır. Aşağıdaki tabloda, bir özel durum nesnesiyle ilişkili her alan listelenir ve COM nesnesi tarafından desteklendiğinde IErrorInfo
varsayılan bilgilerin kaynağı tanımlanır.
Çalışma zamanının bazen iş parçacığında mevcut olduğu durumlarda bir IErrorInfo
öğesini yoksayacağını HRESULT
unutmayın. Bu davranış, ve değerlerinin HRESULT
IErrorInfo
aynı hatayı temsil etmemesi durumunda ortaya çıkabilir.
Özel durum alanı | COM'dan Bilgi Kaynağı |
---|---|
ErrorCode |
HRESULT çağrıdan döndürüldü. |
HelpLink |
Sıfır IErrorInfo->HelpContext değilse, dize birleştirme ve "#" ve IErrorInfo->GetHelpContext ile IErrorInfo->GetHelpFile oluşturulur. Aksi takdirde dizesinden IErrorInfo->GetHelpFile döndürülür. |
InnerException |
Her zaman null başvuru (Nothing Visual Basic'te). |
Message |
dizesinden IErrorInfo->GetDescription döndürüldü. |
Source |
dizesinden IErrorInfo->GetSource döndürüldü. |
StackTrace |
Yığın izlemesi. |
TargetSite |
Başarısız OLAN HRESULT'yi döndüren yöntemin adı. |
, ve StackTrace
gibi Message
Source
özel durum alanları için StackOverflowException
kullanılamaz.