ข้อยกเว้นหรือรหัสข้อผิดพลาด


12

เรากำลังสร้างบริการบนเว็บ (SOAP, .Net) ซึ่งจะพูดคุยกับลูกค้าพื้นเมือง (ส่วนใหญ่) (windows, C ++) และเราสงสัยว่าวิธีที่ดีที่สุดในการสื่อสารข้อผิดพลาดกับลูกค้าคืออะไรเช่น SomethingBadHappened เช่นบริการเข้าสู่ระบบไม่พร้อมใช้งาน หรือสิ่งที่ต้องการผู้ใช้ไม่พบ) และไม่สามารถตัดสินใจระหว่างการส่งข้อยกเว้นไปยังไคลเอนต์หรือใช้รูปแบบรหัสข้อผิดพลาดบางอย่างเพื่อทำดังกล่าว

สิ่งที่คุณต้องการในการจัดการด้านลูกค้า: ได้รับรหัสข้อผิดพลาดหรือจัดการข้อยกเว้น ServerFault ซึ่งมีสาเหตุของข้อผิดพลาดหรือไม่
1) เหตุใดเราจึงคิดยกเว้น: เพราะจะทำให้รหัสฝั่งเซิร์ฟเวอร์มีความสม่ำเสมอมากกว่า
2) เหตุใดเราจึงคิดรหัสข้อผิดพลาด: เพราะเราคิดว่ามันสมเหตุสมผลกว่าจากมุมมองฝั่งไคลเอ็นต์

หาก 2) เป็นจริงเราอาจต้องการรหัสข้อผิดพลาดมากกว่าข้อยกเว้น? เป็นกรณีนี้หรือไม่

นอกจากนี้คำตอบจะเปลี่ยนไปหรือไม่ถ้าเราคุยกับลูกค้าที่จัดการแทนที่จะเป็นลูกค้าพื้นเมือง


เพียงเพื่อเพิ่มความกระจ่าง: a) ฉันกำลังมองหาวิธีปฏิบัติที่ดีที่สุดที่นี่และประสบการณ์จากฝั่งไคลเอ็นต์ (เนื่องจากไคลเอนต์มีความซับซ้อนมากขึ้นและเราจะจัดการกับสิ่งต่าง ๆ ที่ฝั่งเซิร์ฟเวอร์ถ้าเราสามารถรักษารหัสลูกค้าได้ง่ายขึ้น) b) ลูกค้ามีรหัสดั้งเดิมจำนวนมากและเราอาจหรืออาจไม่สามารถใช้ข้อยกเว้น C ++
Amit Wadhwa

สิ่งนี้อาจช่วยได้ www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
Gulshan

คำตอบ:


8

SOAP มีคอนเซปต์ของความผิดพลาดคุณสามารถแปลงข้อยกเว้นเป็นความผิดพลาดในฝั่งเซิร์ฟเวอร์และบนพร็อกซีไคลเอนต์ความผิดพลาดสามารถเปลี่ยนกลับไปเป็นข้อยกเว้นได้อีกครั้ง วิธีนี้ใช้งานได้ดีใน WCF และ Java metro stack ไม่สามารถแสดงความคิดเห็นในไคลเอนต์ C ++

ตามแนวทางปฏิบัติที่ดีที่สุดของ SOA จะกำหนดข้อผิดพลาดทั่วไปหนึ่งข้อและความผิดพลาดเฉพาะเล็กน้อยหากลูกค้าจำเป็นต้องจัดการข้อผิดพลาดบางประเภทแตกต่างกัน ไม่ส่งการติดตามสแต็กข้อยกเว้นไปยังไคลเอ็นต์ในการปรับใช้งานจริง นี่เป็นเพราะในทางทฤษฎีแล้วการสืบค้นกลับของเซิร์ฟเวอร์ก็ไม่มีความหมายสำหรับไคลเอ็นต์และเพื่อเหตุผลด้านความปลอดภัยเช่นกัน บันทึกข้อผิดพลาดแบบเต็มและสแต็คเทรซบนเซิร์ฟเวอร์และส่งการอ้างอิงเฉพาะไปยังบันทึกในความผิด ใน WCF ฉันใช้บล็อก Microsoft Exception Handling จาก Enterprise Library เพื่อสร้าง guid และแปลงข้อยกเว้นเป็นข้อผิดพลาด SOAP

ตรวจสอบคำแนะนำในรูปแบบไมโครซอฟท์และการปฏิบัติ


ขอบคุณมันฟังดูดี คุณสามารถให้ลิงค์ที่เจาะจงกว่านี้กับฉันในหน้านั้นได้ไหม
Amit Wadhwa

นอกจากนี้สิ่งที่เกี่ยวกับข้อผิดพลาดระดับธุรกิจเช่น UserNotFound ฯลฯ สิ่งเหล่านี้ควรได้รับการจัดการเป็นข้อยกเว้น
Amit Wadhwa

โครงการที่ผ่านมาเราไม่เคยใช้ข้อยกเว้นในรหัสหรือข้อบกพร่องใน SOAP เพื่อสื่อสารโหมดความล้มเหลวที่ถูกต้องตามกฎหมาย / ที่คาดไว้ เราใช้รหัสข้อผิดพลาดและปล่อยให้ลูกค้าตัดสินใจว่าจะทำอย่างไรกับพวกเขา ไม่พบผู้ใช้ไม่ใช่ข้อผิดพลาด / ข้อยกเว้นนี่น่าจะเป็นรหัสสถานะ
MrLane

4

ฉันเพิ่งทำบริการเว็บกับห้องสมุด Java 6 ซึ่งสามารถรายงานข้อยกเว้นกลับไปยังผู้โทร (ฉันไม่ได้ดูว่ามันทำโดยอัตโนมัติ)

ความสามารถในการมีไคลเอ็นต์ให้การติดตามสแต็กในรายงานข้อผิดพลาดแก่นักพัฒนานั้นมีประโยชน์มาก (ตรงข้ามกับการรับการประทับเวลาโดยประมาณแล้วต้องค้นหาในบันทึกของคุณหากคุณเกิดขึ้นเพื่อเข้าสู่ระบบ)

ดังนั้นจากมุมมองของนักพัฒนาให้ใช้ข้อยกเว้น


1
ฉันยอมรับว่าสิ่งนี้มีประโยชน์ใน dogfood และเบต้า แต่คุณต้องการคายร่องรอยสแต็กในบันทึกเหตุการณ์หรือไฟล์บันทึกในการใช้งานจริง (และแน่นอนเปิดเผยรายละเอียดเพิ่มเติมเกี่ยวกับบริการที่คุณต้องการ / ต้องการที่จะดำเนินการ )
Amit Wadhwa

2
@ ยอมรับให้ฉันเชื่อมั่นในสิ่งนี้: หากคุณประสบกับสถานการณ์ที่ให้การติดตามสแต็คในการผลิตคุณต้องการสแต็กการติดตาม!

1
ประโยชน์ของการติดตามสแต็คในฝั่งไคลเอ็นต์คืออะไรเราจะบันทึกข้อยกเว้นทั้งหมดในฝั่งเซิร์ฟเวอร์ก่อนส่งผ่านไปยังไคลเอนต์
Amit Wadhwa

นอกจากนี้สิ่งที่เกี่ยวกับข้อผิดพลาดระดับธุรกิจเช่น UserNotFound ฯลฯ สิ่งเหล่านี้ควรได้รับการจัดการเป็นข้อยกเว้น
Amit Wadhwa

-2

หากเป็นบริการเว็บคุณไม่สามารถทำให้เซิร์ฟเวอร์โยนข้อยกเว้นที่ลูกค้าจะได้รับ An exception occurred. Type %s, message %s, stack trace %sอินเตอร์เฟซที่เซิร์ฟเวอร์ของคุณโดยทั่วไปมีการกลับมาจัดเรียงของรหัสข้อผิดพลาดบางอย่างแม้ที่สตริงที่ระบุว่า

สำหรับฝั่งไคลเอ็นต์คุณสามารถขอให้คุณอ่านรหัสการตอบสนองตรวจสอบการตอบสนองเพื่อดูว่ามันมีข้อผิดพลาดและเพิ่มข้อยกเว้นในฝั่งไคลเอ็นต์ นี่เป็นวิธีที่ดีมากในภาษาที่มีการจัดการข้อยกเว้นที่ดีอย่างน้อย อย่างไรก็ตาม C ++ ไม่มีการส่งข้อยกเว้นที่ดีและเป็นความคิดที่ดีที่จะอยู่ห่างจากข้อยกเว้น C ++ ให้มากที่สุด หากคุณไม่สามารถใช้ภาษาที่ดีกว่าได้ให้ลองทำตามรหัสข้อผิดพลาด


ฉันเดาว่าข้อยกเว้นที่ไม่ถูกตรวจจับจะเป็น ServerFault ให้กับลูกค้า
Amit Wadhwa

3
ไม่มีอะไรผิดปกติกับข้อยกเว้น C ++ หรือ C ++ มีเหตุผลมากมายที่จะใช้ภาษาอื่นที่ไม่ใช่ C ++ สำหรับบางโครงการ แต่การจัดการข้อยกเว้นไม่ใช่หนึ่งในนั้น
KeithB

ไม่เพียง แต่ขัดต่อแนวปฏิบัติด้านความปลอดภัยที่ดีที่สุด: ลูกค้าควรทำอะไรกับการติดตามสแต็กของเซิร์ฟเวอร์ของคุณ พิมพ์และส่งให้คุณ? ส่งเป็นอีเมล ใช้สำหรับกระดาษหล่อลื่น?
JensG

@JensG: หากนี่เป็นบริการเว็บไม่ใช่เว็บไซต์ลูกค้าควรเป็นมืออาชีพมากพอที่จะส่งอีเมลถึงคุณเพื่อรายงานข้อผิดพลาด
Mason Wheeler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.