Kami sedang membangun layanan web (SOAP, .Net) yang akan berbicara dengan (kebanyakan) klien asli (windows, C ++) dan kami bertanya-tanya apa cara terbaik untuk mengkomunikasikan kesalahan kepada klien (mis. SesuatuBadterhapus seperti layanan masuk tidak tersedia atau sesuatu seperti pengguna tidak ditemukan) dan belum dapat memutuskan antara melempar pengecualian ke klien atau menggunakan semacam model kode kesalahan untuk melakukan hal di atas.
Apa yang Anda inginkan pada penanganan di sisi klien: menerima kode kesalahan atau menangani pengecualian ServerFault yang berisi alasan kesalahan tersebut?
1) Mengapa kita berpikir pengecualian: Karena itu akan membuat kode sisi server lebih seragam
2) Mengapa kita berpikir kode kesalahan: Karena kita pikir itu lebih masuk akal dari perspektif sisi klien.
Jika 2) benar-benar benar, kita mungkin ingin mencari kode kesalahan daripada pengecualian? Apakah itu yang terjadi di sini?
Juga, apakah jawabannya akan berubah jika kami berbicara dengan klien yang dikelola alih-alih klien asli?
sumber
Jawaban:
SOAP memiliki konsep kesalahan , Anda dapat mengonversi pengecualian menjadi kesalahan di sisi server dan pada proksi klien kesalahan tersebut dapat dikonversi kembali menjadi pengecualian. Ini bekerja sangat baik di WCF dan Java metro stack, tidak dapat mengomentari klien asli C ++.
Mengenai praktik terbaik SOA mendefinisikan satu kesalahan generik dan beberapa kesalahan spesifik hanya jika klien perlu menangani jenis kesalahan tertentu secara berbeda. Jangan pernah mengirim jejak jejak pengecualian ke klien dalam penyebaran produksi. Ini karena secara teori penelusuran server tidak memiliki arti bagi klien dan juga untuk alasan keamanan. Catat kesalahan penuh dan stacktrace di server dan kirim referensi unik ke log kesalahan. Di WCF saya menggunakan blok Penanganan Pengecualian Microsoft dari Enterprise Library untuk menghasilkan panduan dan juga mengonversi pengecualian menjadi kesalahan SOAP.
Periksa panduan di Pola dan Praktik Microsoft .
sumber
Saya baru-baru ini melakukan layanan web dengan perpustakaan Java 6, yang dapat melaporkan pengecualian kembali ke pemanggil (saya belum melihat bagaimana seperti yang dilakukan secara otomatis).
Kemampuan klien untuk memberikan jejak stack dalam laporan kesalahan kepada pengembang telah sangat berguna (berlawanan dengan perkiraan cap waktu dan kemudian harus mencarinya di log Anda, jika Anda log in).
Jadi, dilihat dari sudut pandang pengembang, gunakan Pengecualian.
sumber
Jika ini adalah layanan web, Anda tidak bisa benar-benar menyebabkan server untuk melemparkan pengecualian yang akan ditangkap oleh klien. Pada antarmuka, server Anda pada dasarnya harus mengembalikan semacam kode kesalahan, bahkan jika itu adalah string yang mengatakan
An exception occurred. Type %s, message %s, stack trace %s
.Sedangkan untuk sisi klien, Anda bisa meminta kode pembacaan respons Anda memeriksa respons untuk melihat apakah ada kesalahan dan menimbulkan pengecualian di sisi klien. Itu cara yang sangat baik untuk melakukannya, dalam bahasa dengan penanganan pengecualian yang baik setidaknya. Namun, C ++ tidak memiliki pengecualian yang baik untuk penyerahan, dan merupakan ide yang bagus untuk menjauhi pengecualian C ++ sejauh mungkin. Jika Anda tidak dapat menggunakan bahasa yang lebih baik, maka cukup pertahankan kode kesalahan.
sumber