Aracılığıyla paylaş


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.Exceptionbir 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 HRESULTIErrorInfo 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

  1. adlı NoAccessException yeni bir özel durum sınıfı oluşturmak ve bunu HRESULT E_ACCESSDENIEDile 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 COMExceptioneş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 IErrorInfovarsayı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 HRESULTIErrorInfo 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->GetHelpContextile IErrorInfo->GetHelpFile oluşturulur. Aksi takdirde dizesinden IErrorInfo->GetHelpFiledöndürülür.
InnerException Her zaman null başvuru (Nothing Visual Basic'te).
Message dizesinden IErrorInfo->GetDescriptiondöndürüldü.
Source dizesinden IErrorInfo->GetSourcedöndürüldü.
StackTrace Yığın izlemesi.
TargetSite Başarısız OLAN HRESULT'yi döndüren yöntemin adı.

, ve StackTrace gibi MessageSourceözel durum alanları için StackOverflowExceptionkullanılamaz.

Ayrıca bkz.