คุณจะกำหนดรหัสข้อผิดพลาดได้อย่างไร


13

เมื่อพัฒนาโครงการขนาดกลางคุณจะระบุสร้างและรักษารหัสข้อผิดพลาดได้อย่างไร

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

จะเจาะจงมากขึ้นฉันกำลังพูดถึงรหัสข้อผิดพลาดเช่น:

Error 401 Unauthorized.


1
รหัสข้อผิดพลาด? ชอบ "หมายเลขมายากล" หรือไม่ ตัวอย่างเช่น ... ข้อผิดพลาด 001 จากนั้นคุณไปที่รายการและอ่านข้อผิดพลาด 001 หมายความว่า bla bla bla ... ใช่ไหม
wleao

@wleao - Yessir ฉันจะแก้ไขคำถามของฉันเพื่อให้ครอบคลุม ขอบคุณ.
ahodder

อ่านสิ่งนี้: en.wikipedia.org/wiki/Magic_number_%28programming%29
wleao

ตามที่คุณแก้ไขในคำถามของคุณ ดูวิธีที่พวกเขาทำด้วย http ฉันไม่รู้ว่ามันเป็นความคิดที่ดีหรือไม่หากใช้ตัวเลขเวทย์มนตร์ อย่างไรก็ตามหากคุณเต็มใจที่จะทำตามแนวคิดของพวกเขา ตัวอย่างเช่นพวกเขามีอนุกรมวิธานของข้อผิดพลาด (คุณมีหรือไม่)
wleao

@wleao - ยังไม่ได้ แต่ขอบคุณคุณและPéterTörökฉันจะต้องสร้างแน่นอน :)
ahodder

คำตอบ:


16

เลขที่

รหัสข้อผิดพลาดเป็นสิ่งที่ผิดสมัยพวกมันเกิดจากสมัยก่อนเมื่อผลที่ออกมานั้นยากและมีราคาแพงและวิธีเดียวที่จะส่งสัญญาณข้อผิดพลาดอาจเกิดจากไฟหน้าแผงด้านหน้า: แผงด้านหน้า pdp11 / 70

ทุกวันนี้เรามีการจัดการข้อยกเว้นที่เป็นผู้ใหญ่อยู่ในทุกภาษากระแสหลัก ใช้มัน. ให้ข้อมูลผู้ใช้ที่พวกเขาสามารถทำงานได้; อย่ารบกวนพวกเขาด้วยเทคนิค blah-blah แต่บอกพวกเขาอย่างคร่าว ๆ ว่าเกิดอะไรขึ้นและพวกเขาสามารถทำอะไรได้บ้าง สำหรับการบันทึกเพียงแค่ให้ชื่อที่เป็นคำอธิบายของคุณและบันทึกชื่อ ง่ายต่อการจดจำและค้นหาได้ง่ายขึ้นโดยใช้ grep หรือเครื่องมือค้นหาที่คล้ายกัน

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


ขอบคุณสำหรับคำตอบโดยละเอียดที่มีเหตุผลและเป็นเรื่องที่ดี
ahodder

การใช้ภาพประกอบตรงกับการโต้แย้งของคุณอย่างสมบูรณ์แบบ ฉันอ่านเกี่ยวกับ PDP-11 ตลอดกาลแล้ว แต่นี่เป็นอันแรกที่ฉันเคยเห็น ขอบคุณ
Mike Owens

2
ภายในโค้ดฉันควรจัดการรหัสข้อผิดพลาดและฉันไม่เก่า
JeffO

@Jeff: สิ่งที่คุณสามารถทำได้ด้วยรหัสข้อผิดพลาดก็สามารถทำได้โดยมีข้อยกเว้นแล้วอีกเล็กน้อย หากคุณต้องการเลียนแบบรหัสข้อผิดพลาดโดยมีข้อยกเว้นสิ่งที่คุณต้องทำคือการโยนแทนที่จะส่งคืนรหัสข้อผิดพลาดและจับแทนการเปรียบเทียบค่าส่งคืนกับ E_OK (หรือการตอบสนองแบบ OK) เพื่อความเป็นธรรมแม้ว่า C ไม่มีข้อยกเว้นจริงและการกระโดดยาวไม่สะดวกดังนั้นถ้าคุณทำ C คุณจะได้รับการยกเว้น
tdammers

@ ไมค์: ภาพนี้มาจากบทความวิกิพีเดียในซีรี่ส์ PDP-11; ถ้านั่นไม่ใช่เรื่องง่ายที่จะหาฉันไม่รู้ว่าเป็นอะไร
tdammers

6

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


เพิ่มคำตอบของคุณเกี่ยวกับเรื่องอนุกรมวิธาน มันจะทำให้การจัดการและบำรุงรักษาข้อผิดพลาดง่ายขึ้น
wleao

3

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

(สมมติว่าภาษาของคุณรองรับข้อยกเว้น)

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


นั่นเป็นเรื่องจริงและฉันทำเช่นนั้น แต่ฉันจะบอกผู้ใช้อย่างไร ฉันแน่ใจว่าพวกเขาจะมีชีวิตชีวาถ้าพวกเขาเร่ขายพร้อมและแอปพลิเคชันก็ตายไม่มีคำอธิบายหรืออะไรที่จะทำให้ควันที่
ahodder

6
ฉันคิดว่ามีสิ่งต่าง ๆ อย่างน้อยสามอย่างที่สับสนที่นี่ สิ่งแรกคือรหัสที่ใช้จากซอฟต์แวร์กับซอฟต์แวร์เช่นใน HTTP ประการที่สองคือรหัสที่ผู้ใช้สามารถใช้ในรายงานข้อผิดพลาด (เช่นหมายเลขเหตุการณ์) สุดท้ายคือข้อความที่สามารถแสดงต่อผู้ใช้ มันอาจช่วยในการพิจารณาพวกเขาเป็นสิ่งที่แยกจากกัน
Darien

2
เหตุผลสำคัญข้อหนึ่งในการใช้รหัสข้อผิดพลาดคือเมื่อคุณสร้างแอปพลิเคชันส่วนหลัง มันง่ายกว่าและสง่างามกว่าสำหรับโปรแกรมไคลเอนต์ในการตีความและตอบสนองต่อโค้ดมากกว่าข้อความแสดงข้อผิดพลาดหรือการติดตามสแต็ก ข้อผิดพลาดบางอย่างไม่ได้มาจากข้อบกพร่อง
Kaypro II

1
ข้อยกเว้นยากมากที่จะทำถูก! ดูลิงค์ใน: programmers.stackexchange.com/questions/97874/…
Coder

@Coder: ตัวอย่างของคุณละเมิดข้อยกเว้น คุณควรจับสิ่งที่คุณคาดหวังว่าจะถูกโยนทิ้งไป วิธีการส่วนใหญ่ไม่จำเป็นต้องคาดหวังแม้แต่ข้อยกเว้นเดียวที่ถูกโยนทิ้งไป มันเป็นความรับผิดชอบโดยสิ้นเชิงโปรแกรมเมอร์ที่จะตัดสินใจสิ่งที่จะจัดการและผมเห็นด้วยมันอาจจะเป็นเรื่องยากที่จะได้รับมันขวา
ด่าน

2

ฉันจะถือว่าบริบทเชิงกระบวนการ (C) หากคุณมีวัตถุวัตถุข้อผิดพลาดมักจะดีกว่าไม่ว่าจะเป็นข้อยกเว้นหรือไม่

คุณควรใช้รหัสข้อผิดพลาดในแต่ละโมดูล สำหรับไลบรารีคุณสามารถมีส่วนหัวพิเศษที่แสดงรายการรหัสข้อผิดพลาดโดยมีหมายเลข 1, 2 ฯลฯ (หรือ -1, -2 หากคุณต้องการ) ตรวจสอบให้แน่ใจว่าได้ส่งคืนหนึ่งในรหัสเหล่านี้เสมอเช่นแปลerrnoเป็นรหัสของคุณเอง หากคุณมีโมดูลหลายเลเยอร์ให้แปลแต่ละขั้นตอน (หรือกำหนดช่วงสำหรับข้อผิดพลาดที่ลึกกว่าเช่นค่า 1001 - 1,050 มาจากโมดูลอื่น ๆ )

สิ่งสำคัญคือคุณต้องระบุวิธีการแปลรหัสเป็นสตริง คุณไม่ควรรายงานเฉพาะรหัสที่นำไปสู่ความยุ่งยาก จริง ๆ แล้วรหัสใด ๆ ในแอปพลิเคชันของคุณควรมาพร้อมกับฟังก์ชันการแปลสตริง ยกตัวอย่างเช่น libc มักจะมีstrerrorและแต่เศร้าขาดstrsignalstrwaitstatus


รายละเอียดที่ยอดเยี่ยมขอบคุณ สิ่งนี้มีประโยชน์จริง ๆ
ahodder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.