Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Metode COM melaporkan kesalahan dengan mengembalikan HRESULTs; metode .NET melaporkannya dengan menampilkan pengecualian. Runtime bahasa umum menangani transisi antara keduanya. Setiap kelas pengecualian dalam .NET Framework memetakan ke HRESULT.
Kelas pengecualian yang ditentukan pengguna dapat menentukan HRESULT apa pun yang sesuai. Kelas pengecualian ini dapat secara dinamis mengubah HRESULT untuk dikembalikan ketika pengecualian dihasilkan dengan mengatur HResult bidang pada objek pengecualian. Informasi tambahan tentang pengecualian diberikan kepada klien melalui IErrorInfo antarmuka, yang diimplementasikan pada objek .NET dalam proses yang tidak dikelola.
Jika Anda membuat kelas yang memperluas System.Exception, Anda harus menetapkan bidang HRESULT selama konstruksi. Jika tidak, kelas dasar menetapkan nilai HRESULT. Anda dapat memetakan kelas pengecualian baru ke HRESULT yang ada dengan menyediakan nilai dalam konstruktor pengecualian.
Perhatikan bahwa runtime bahasa umum terkadang akan mengabaikan HRESULT dalam kasus jika ada IErrorInfo berada di alur. Perilaku ini dapat terjadi dalam kasus jika HRESULT dan IErrorInfo tidak mewakili kesalahan yang sama.
Untuk membuat kelas pengecualian baru dan memetakannya ke HRESULT
Gunakan kode berikut untuk membuat kelas pengecualian baru yang disebut
NoAccessExceptiondan memetakannya ke HRESULTE_ACCESSDENIED.Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }
Anda mungkin menemukan program (dalam bahasa pemrograman apa pun) yang menggunakan kode terkelola dan tidak terkelola secara bersamaan. Misalnya, marshaller kustom dalam contoh kode berikut menggunakan Marshal.ThrowExceptionForHR(int HResult) metode untuk menampilkan pengecualian dengan nilai HRESULT tertentu. Metode mencari HRESULT dan menghasilkan jenis pengecualian yang sesuai. Misalnya, HRESULT dalam fragmen kode berikut menghasilkan ArgumentException.
CMyClass::MethodThatThrows
{
Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}
Tabel berikut menyediakan pemetaan umum dari HRESULT ke kelas pengecualian yang sebanding dengan .NET. Nilai HRESULT tanpa pemetaan eksplisit dipetakan ke COMException. Pemetaan lengkap terbaru dapat ditemukan di repositori dotnet/runtime bahasa umum.
| HRESULT | Pengecualian .NET |
|---|---|
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT atau 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 |
Untuk mengambil informasi kesalahan yang diperluas, klien terkelola harus memeriksa bidang objek pengecualian yang dihasilkan. Agar objek pengecualian memberikan informasi yang berguna tentang kesalahan, objek COM harus mengimplementasikan IErrorInfo antarmuka. Runtime bahasa umum menggunakan informasi yang disediakan oleh IErrorInfo untuk menginisialisasi objek pengecualian.
Jika objek COM tidak mendukung IErrorInfo, runtime bahasa umum menginisialisasi objek pengecualian dengan nilai default. Tabel berikut mencantumkan setiap bidang yang terkait dengan objek pengecualian dan mengidentifikasi sumber informasi default saat objek COM mendukung IErrorInfo.
Perhatikan bahwa runtime bahasa umum terkadang akan mengabaikan HRESULT dalam kasus jika ada IErrorInfo berada di alur. Perilaku ini dapat terjadi dalam kasus jika HRESULT dan IErrorInfo tidak mewakili kesalahan yang sama.
| Bidang pengecualian | Sumber Informasi dari COM |
|---|---|
ErrorCode |
HRESULT dikembalikan dari panggilan. |
HelpLink |
Jika IErrorInfo->HelpContext bukan nol, string dibentuk dengan menggabungkan IErrorInfo->GetHelpFile dan "#" dan IErrorInfo->GetHelpContext. Jika tidak, string dikembalikan dari IErrorInfo->GetHelpFile. |
InnerException |
Selalu referensi nol (Nothing dalam Visual Basic). |
Message |
String dikembalikan dari IErrorInfo->GetDescription. |
Source |
String dikembalikan dari IErrorInfo->GetSource. |
StackTrace |
Jejak Tumpukan |
TargetSite |
Nama metode yang mengembalikan HRESULT yang gagal. |
Bidang pengecualian, seperti Message, Source, dan StackTrace tidak tersedia untuk StackOverflowException.