Mengambil Kode Kesalahan

Seperti semua aplikasi, WMI menerima kode kesalahan dari sistem operasi Windows.

Saat Anda menerima kode kesalahan, Anda memiliki opsi berikut:

  • Lihatlah log peristiwa.

    WMI mengirim pesan kesalahan ke layanan Log Peristiwa yang memeriksa log peristiwa untuk membantu menentukan penyebab kesalahan. Anda dapat menggunakan kelas yang didukung penyedia Log Peristiwa untuk mengakses log peristiwa secara terprogram.

  • Ambil kode kesalahan secara normal.

    WMI mendukung teknik standar untuk mengambil kode kesalahan, yaitu kode kesalahan COM untuk C++, dan objek kesalahan asli, seperti Objek Err (VBScript), atau SWbemLastError jika penyedia menyediakan informasi kesalahan.

Untuk informasi selengkapnya, lihat Memanipulasi Informasi Kelas dan Instans.

Bagian berikut dibahas dalam topik ini:

Menangani Kesalahan dengan VBScript

Jika panggilan ke WMI melalui Scripting API untuk WMI menyebabkan kesalahan, Anda memiliki opsi berikut untuk mengakses informasi kesalahan:

  • Gunakan mekanisme kesalahan asli bahasa skrip, misalnya, dalam VBScript gunakan Objek Err (VBScript) untuk mendukung penanganan kesalahan.
  • Buat objek SWbemLastError untuk mendapatkan laporan kesalahan.

Skrip berikut menunjukkan penggunaan Objek Err asli (VBScript). Ketika nilai yang salah untuk handel proses diberikan, kesalahan akan dihasilkan.

On Error Resume Next
Set objProcess = GetObject( _
    "winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number

Catatan

Properti DeskripsiObjek Err (VBScript) kosong saat menyambungkan ke WMI melalui moniker "winmgmts:". Namun, jika Anda terhubung menggunakan SWbemLocator, deskripsi tersedia.

Tabel berikut mencantumkan properti Objek Err (VBScript).

Properti Contains
Deskripsi
Deskripsi kesalahan yang dilokalkan dan dapat dibaca manusia.
Number
HRESULT dikembalikan oleh Scripting API untuk WMI.
Sumber
Mengidentifikasi objek yang memunculkan kesalahan.

Skrip berikut menunjukkan penggunaan objek SWbemLastError untuk mendapatkan informasi kesalahan terperinci. Perhatikan bahwa tidak semua penyedia menyediakan informasi ke SWbemLastError. Untuk informasi selengkapnya tentang kode kesalahan dalam skrip, lihat WbemErrorEnum.

On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
            & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName

Menangani Kesalahan Menggunakan C++

Aplikasi klien WMI dapat menerima kesalahan khusus COM atau khusus WMI. Kesalahan COM sesuai dengan struktur kode kesalahan COM. Semua antarmuka WMI dapat mengembalikan kesalahan khusus COM kecuali antarmuka IWbemContext, IWbemClassObject, dan IWbemQualifierSet . Untuk informasi selengkapnya tentang kode kesalahan COM, lihat Penanganan Kesalahan. Halaman referensi antarmuka WMI mencantumkan kode kesalahan WMI yang sesuai di bagian Kode Kesalahan.

Aplikasi klien harus mengikuti standar COM untuk memeriksa status dan kode pengembalian kesalahan. Perbedaan utama yang harus Anda pilih adalah apakah Anda ingin mengambil kode kesalahan dari panggilan sinkron, semisinkron, atau asinkron.

Untuk mengakses pesan kesalahan sinkron dan semisinkron menggunakan C++

  1. Ambil informasi kesalahan dengan panggilan ke fungsi GETErrorInfo COM.

    Pastikan untuk memanggil GetErrorInfo segera setelah metode antarmuka menunjukkan kesalahan. Ini termasuk salah satu metode IWbemCallResult yang Anda panggil saat memproses proses semisinkron.

  2. Periksa objek kesalahan COM yang dikembalikan dengan panggilan ke metode IErrorInterface::QueryInterface .

    Pastikan untuk menentukan IID_WbemClassObject untuk parameter riid dalam panggilan QueryInterface . Metode QueryInterface mengembalikan instans kelas WMI, biasanya __ExtendedStatus.

WMI tidak mengirimkan objek kesalahan melalui GetErrorInfo untuk panggilan asinkron karena tidak ada cara untuk mengetahui kapan, atau di utas mana panggilan asinkron terjadi. Oleh karena itu, kode Anda hanya dapat menangani kesalahan tertentu atau melewati kegagalan panggilan melalui COM.

Catatan

Karena panggilan balik ke sink mungkin tidak dikembalikan pada tingkat autentikasi yang sama dengan yang diperlukan klien, disarankan agar Anda menggunakan semisinkron alih-alih komunikasi asinkron. Untuk informasi selengkapnya, lihat Memanggil Metode.

Untuk mengakses pesan kesalahan asinkron menggunakan C++

  • Ambil objek kesalahan COM dari implementasi IWbemObjectSink::SetStatus Anda.

    Pseudocode berikut menunjukkan implementasi penanganan kesalahan umum untuk aplikasi klien.

    HRESULT hRes = SomeMethod;
    
    // Check for specific error and status codes.
    if (hRes == WBEM_E_NOT_FOUND)
    {
    // Processing to handle specific error code
    }
    else if hRes == WBEM_S_DUPLICATE_OBJECTS
    {
    // All other cases, including errors specific to COM
    }
    else if (FAILED(hRes))
    {
    
    }