Bagikan melalui


Menunjukkan Kesalahan berdasarkan Pengecualian

Untuk programmer C tradisional, kesalahan biasanya dikembalikan melalui nilai yang dikembalikan, atau parameter [out] khusus yang mengembalikan kode kesalahan. Ini mengarah ke antarmuka yang diimplementasikan dengan cara berikut:

long sample(...)
{
    ...
    p = new Cbar(...);
    if (p == NULL)
    {
        // cleanup
        ...
        return ERROR_OUTOFMEMORY;
    }
}

Masalah dengan pendekatan ini adalah bahwa nilai pengembalian RPC hanyalah bilangan bulat panjang. Mereka tidak memiliki arti khusus sebagai kesalahan (perhatikan bahwa error_status_t tidak memiliki semantik khusus di sisi server), yang membawa implikasi penting.

Pertama, RPC tidak diperingatkan bahwa operasi gagal; ia mencoba untuk membatalkan semua argumen [in, out] dan [out]. Semantik kegagalan handel konteks juga berbeda. Paket yang dikembalikan ke klien pada dasarnya adalah paket sukses, dengan kode kesalahan terkubur jauh di dalam paket. Ini juga berarti RPC tidak menggunakan informasi kesalahan yang diperluas, sehingga perangkat lunak klien sering kali tidak dapat membedakan di mana panggilan gagal.

Menunjukkan kesalahan dalam rutinitas server RPC dengan melemparkan pengecualian Structured Exception Handling (SEH) (bukan C++) adalah pendekatan yang jauh lebih baik. Ketika pengecualian SEH dilemparkan, kontrol langsung masuk ke run time RPC. Kesalahan terkadang terjadi jauh dalam rutinitas yang tidak dapat dibersihkan dengan benar, dan perlu menunjukkan kesalahan kepada pemanggilnya. Rutinitas harus mengembalikan kesalahan ke pemanggilnya, yang pada gilirannya dapat mengembalikan kesalahan ke pemanggilnya dan sebagainya. Namun, rutinitas server terakhir pada tumpukan harus melemparkan pengecualian sebelum kembali ke RPC untuk menunjukkan kepada RPC bahwa terjadi kesalahan.

Penanganan Pengecualian