Pengecualian yang Diharapkan

Sampel ExpectedExceptions menunjukkan cara menangkap pengecualian yang diharapkan saat menggunakan klien yang diketik. Sampel ini didasarkan pada Memulai yang mengimplementasikan layanan kalkulator. Dalam sampel ini, klien adalah aplikasi konsol (.exe) dan layanan di-hosting oleh Layanan Informasi Internet (IIS).

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Sampel ini menunjukkan penangkapan dan penanganan dua jenis pengecualian yang diharapkan yang harus ditangani oleh program yang benar: TimeoutException dan CommunicationException.

Pengecualian yang dilemparkan dari metode komunikasi pada klien Windows Communication Foundation (WCF) diharapkan atau tidak diharapkan. Pengecualian yang tidak diharapkan mencakup kegagalan katastrofe seperti OutOfMemoryException dan kesalahan pemrograman seperti ArgumentNullException atau InvalidOperationException. Biasanya tidak ada cara yang berguna untuk menangani kesalahan tak terduga, jadi biasanya Anda tidak boleh menangkapnya saat memanggil metode komunikasi klien WCF.

Pengecualian tak terduga dari metode komunikasi di komputer klien WCF mencakup TimeoutException, CommunicationException, dan kelas turunan apa pun dari CommunicationException. Ini menunjukkan masalah selama komunikasi yang dapat ditangani secara aman dengan membatalkan klien WCF dan melaporkan kegagalan komunikasi. Karena faktor eksternal dapat menyebabkan kesalahan ini dalam aplikasi apa pun, aplikasi yang benar harus menangkap pengecualian ini dan memulihkannya jika terjadi.

Terdapat beberapa kelas turunan CommunicationException yang dapat dilemparkan klien. Dalam beberapa kasus, aplikasi juga menangkap beberapa dari ini untuk melakukan penanganan khusus, tetapi biarkan yang lain ditangani sebagai CommunicationException. Hal ini dapat dicapai dengan menangkap jenis pengecualian yang lebih spesifik terlebih dahulu dan kemudian menangkap CommunicationException dalam klausul tangkapan selanjutnya.

Kode yang memanggil metode komunikasi klien harus memanggil TimeoutException dan CommunicationException. Salah satu cara untuk menangani kesalahan tersebut adalah dengan membatalkan klien dan melaporkan kegagalan komunikasi.

try
{
    ...
    double result = client.Add(value1, value2);
    ...
    client.Close();
}
catch (TimeoutException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}
catch (CommunicationException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}

Jika pengecualian yang diharapkan terjadi, klien mungkin atau mungkin tidak dapat digunakan setelahnya. Untuk menentukan apakah klien masih dapat digunakan, periksa apakah properti StateCommunicationState.Opened. Jika masih dibuka, maka masih bisa digunakan. Jika tidak, Anda harus membatalkan klien dan merilis semua referensi untuk itu.

Perhatian

Anda mungkin mengamati bahwa klien yang memiliki sesi sering kali tidak lagi dapat digunakan setelah pengecualian, dan klien yang tidak memiliki sesi sering kali masih dapat digunakan setelah pengecualian. Namun, tidak satu pun dari ini yang dijamin, jadi jika Anda ingin terus menggunakan klien setelah pengecualian, aplikasi Anda harus memeriksa properti State untuk memverifikasi klien masih dibuka.

Saat Anda menjalankan sampel, respons dan pengecualian operasi ditampilkan di jendela konsol klien.

Proses klien menjalankan dua skenario, setiap skenario mencoba memanggil Add diikuti oleh Divide. Skenario pertama menyimulasikan masalah jaringan dengan membatalkan klien sebelum membuat panggilan ke Divide. Skenario kedua menyebabkan kondisi waktu habis dengan mengatur waktu habis terlalu singkat untuk menyelesaikan metode. Output yang diharapkan dari proses klien adalah:

Add(100,15.99) = 115.99
Simulated network problem occurs...
Got System.ServiceModel.CommunicationObjectAbortedException
Add(100,15.99) = 115.99
Set timeout too short for method to complete...
Got System.TimeoutException

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.