Penanganan kesalahan dan mengembalikan nilai

VSPackages dan COM menggunakan arsitektur yang sama untuk kesalahan. Fungsi SetErrorInfo dan GetErrorInfo adalah bagian dari antarmuka pemrograman aplikasi Win32 (API). Setiap VSPackage di lingkungan pengembangan terintegrasi (IDE) dapat memanggil API Win32 global ini untuk merekam informasi kesalahan yang kaya saat menerima pemberitahuan kesalahan. Visual Studio SDK menyediakan rakitan interop untuk mengelola informasi kesalahan.

Metode interop

Sebagai kenyamanan, IDE menyediakan metode, , SetErrorInfountuk digunakan alih-alih memanggil API Win32. Dalam kode terkelola gunakan SetErrorInfo. Ketika kesalahan HRESULT tiba di tingkat di mana pesan kesalahan harus ditampilkan (ini sering kali objek mengimplementasikan IOleCommandTarget handler perintah), IDE menggunakan metode lain, ReportErrorInfo, untuk menampilkan kotak pesan yang sesuai. Dalam kode terkelola ReportErrorInfo gunakan metode .

Sebagai implementer VSPackage, objek COM Anda biasanya menerapkan ISupportErrorInfo. Antarmuka ISupportErrorInfo memastikan bahwa informasi kesalahan yang kaya dapat bergerak secara vertikal ke atas rantai panggilan. Objek yang mungkin digunakan di seluruh proses atau di seluruh utas harus mendukung ISupportErrorInfo untuk memastikan bahwa informasi kesalahan yang kaya dinamai kembali dengan benar ke pemanggil.

Semua objek yang terkait dengan VSPackages dan yang terlibat dalam memperluas IDE, termasuk pabrik editor, editor, hierarki, dan layanan yang ditawarkan, harus mendukung informasi kesalahan yang kaya. Meskipun IDE tidak memerlukan objek VSPackage ini untuk diimplementasikan ISupportErrorInfo, ide selalu didorong.

IDE bertanggung jawab untuk melaporkan informasi kesalahan dan menampilkannya kepada pengguna Visual Studio setiap kali HRESULT disebarkan ke IDE. IDE juga merupakan mekanisme untuk membuat ErrorInfo objek.

Panduan umum

Anda juga dapat menggunakan SetErrorInfo metode dan ReportErrorInfo untuk mengatur dan melaporkan kesalahan yang bersifat internal untuk implementasi VSPackage Anda. Namun, sebagai aturan umum, ikuti panduan ini untuk menangani pesan kesalahan di VSPackage Anda:

  • Terapkan ISupportErrorInfo di objek VSPackage COM Anda.

  • Buat mekanisme pelaporan kesalahan yang memanggil SetErrorInfo metode dalam objek yang mengimplementasikan IOleCommandTarget.

  • Biarkan IDE menampilkan kesalahan kepada pengguna melalui ReportErrorInfo metode .

Informasi kesalahan dalam IDE

Aturan berikut menunjukkan cara menangani informasi kesalahan di IDE Visual Studio:

  • Sebagai strategi defensif untuk menjamin bahwa info kesalahan kedaluwarsa tidak dilaporkan kepada pengguna, fungsi yang memanggil ReportErrorInfo metode harus terlebih dahulu memanggil metode .SetErrorInfo null Teruskan untuk menghapus pesan kesalahan cache sebelum memanggil apa pun yang mungkin mengatur informasi kesalahan baru.

  • Fungsi yang tidak secara langsung melaporkan pesan kesalahan hanya diizinkan untuk memanggil SetErrorInfo metode jika mengembalikan kesalahan HRESULT. Diperbolehkan untuk menghapus ErrorInfo pada entri ke fungsi atau saat mengembalikan S_OK. Satu-satunya pengecualian untuk aturan ini adalah ketika panggilan mengembalikan kesalahan HRESULT dari mana pihak penerima dapat secara eksplisit memulihkan atau mengabaikan dengan aman.

  • Setiap pihak yang secara eksplisit mengabaikan kesalahan HRESULT harus memanggil SetErrorInfo metode dengan S_OK. Jika tidak, ErrorInfo objek mungkin secara tidak sengaja digunakan ketika pihak lain menghasilkan kesalahan tanpa menyediakannya sendiri ErrorInfo.

  • Semua metode yang berasal dari kesalahan HRESULT didorong untuk memanggil SetErrorInfo metode untuk memberikan informasi kesalahan yang kaya. Jika yang dikembalikan HRESULT adalah kesalahan khusus FACILITY_ITF , maka metode diperlukan untuk menyediakan objek yang tepat ErrorInfo . Jika kesalahan yang dikembalikan adalah kesalahan sistem standar (misalnya, , E_OUTOFMEMORY, E_ABORT, E_UNEXPECTEDE_INVALIDARG, , dan sebagainya.) dapat diterima untuk mengembalikan kode kesalahan tanpa secara eksplisit memanggil SetErrorInfo metode . Sebagai strategi pengodean defensif, ketika berasal dari kesalahan HRESULT (termasuk kesalahan sistem), selalu panggil SetErrorInfo metode , baik dengan ErrorInfo menjelaskan kegagalan secara lebih rinci, atau null.

  • Semua fungsi yang mengembalikan kesalahan yang berasal dari panggilan lain harus meneruskan informasi yang diterima dari panggilan yang gagal di HRESULT tanpa mengubah ErrorInfo objek.

Lihat juga