Kode Pengecualian atau Kesalahan

12

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?

Amit Wadhwa
sumber
Hanya untuk menambahkan sedikit klarifikasi: a) Saya mencari praktik terbaik di sini dan pengalaman dari sisi klien (karena klien jauh lebih rumit dan kami lebih suka menangani hal-hal di sisi server jika kami dapat membuat kode klien lebih sederhana) b) Klien berisi banyak kode lawas dan kami mungkin atau mungkin tidak dapat menggunakan pengecualian C ++.
Amit Wadhwa
Ini dapat membantu- www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
Gulshan

Jawaban:

8

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 .

softveda
sumber
Terima kasih ini kedengarannya bagus. Bisakah Anda memberi saya tautan yang lebih spesifik di sana di dalam halaman di sana.
Amit Wadhwa
Juga bagaimana dengan kesalahan tingkat bisnis seperti UserNotFound dll. Haruskah ini juga ditangani sebagai pengecualian
Amit Wadhwa
Ini melewati proyek-proyek yang kami tidak pernah menggunakan Pengecualian dalam kode atau Kesalahan dalam SOAP untuk mengomunikasikan mode kegagalan yang sah / diharapkan. Kami menggunakan kode kesalahan dan menyerahkannya kepada klien untuk memutuskan apa yang harus dilakukan dengannya. Pengguna tidak ditemukan sebenarnya bukan kesalahan / pengecualian, ini mungkin harus menjadi kode status.
MrLane
4

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
1
Saya setuju bahwa ini bisa berguna dalam dogfood dan beta, tetapi apakah Anda benar-benar ingin memuntahkan jejak tumpukan di log peristiwa atau file log dalam penggunaan dunia nyata (dan tentu saja mengungkapkan lebih banyak detail tentang layanan daripada yang Anda butuhkan / ingin proseskan )
Amit Wadhwa
2
@Amit, percayalah pada saya ini: Jika Anda menekan situasi memberikan jejak stack dalam produksi, Anda INGIN jejak stack!
1
Apa manfaat dari jejak tumpukan di sisi klien, Kami pasti akan mencatat semua pengecualian di sisi server sebelum meneruskannya ke klien.
Amit Wadhwa
Juga bagaimana dengan kesalahan tingkat bisnis seperti UserNotFound dll. Haruskah ini juga ditangani sebagai pengecualian
Amit Wadhwa
-2

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.

Mason Wheeler
sumber
Saya kira pengecualian yang tidak tertangkap akan berlaku sebagai ServerFault ke klien
Amit Wadhwa
3
Tidak ada yang salah dengan pengecualian C ++, atau C ++. Ada banyak alasan untuk menggunakan bahasa selain C ++ untuk proyek-proyek tertentu, tetapi penanganan pengecualian bukan salah satunya.
KeithB
Tidak hanya itu bertentangan dengan praktik terbaik keamanan: Apa sebenarnya yang harus dilakukan klien dengan jejak tumpukan server Anda? Cetak dan kirimkan kepada Anda? Kirim sebagai email? Gunakan untuk kertas pelumas?
JensG
@JensG: Jika ini adalah layanan web dan bukan situs web , klien harus cukup profesional untuk mengirim email kepada Anda sebagai laporan bug.
Mason Wheeler