ทำไมไม่ใช้คำว่า bug แทนการยกเว้น? [ปิด]


18

หากเราอ้างถึงข้อยกเว้นว่าเป็นข้อบกพร่องทำไมไม่เรียกมันว่าบั๊กตั้งแต่แรกแทนที่จะเป็นข้อยกเว้น?

หากในรหัสเรียกว่าข้อยกเว้นและทันทีที่มันเกิดขึ้นจะเรียกว่าข้อผิดพลาด ถ้าอย่างนั้นทำไมไม่เรียกมันว่าบั๊กในตอนแรกล่ะ?

ขอบคุณสำหรับคำตอบหรือความคิดเห็น


ฉันหวังว่ารายละเอียดทางเทคนิคที่ฉันพูดถึงช่วยอธิบายความแตกต่างของข้อยกเว้นเทียบกับข้อบกพร่อง คำถามยอดเยี่ยม BTW, +1
Jeremy Thompson


1
ที่จริงฉันไม่รู้ว่าคุณจะสับสนได้อย่างไรเพราะมันต่างกันมาก ข้อยกเว้นเป็นกรณีที่จัดการโดยรหัสซึ่งระบุข้อผิดพลาดบางชนิด โดยทั่วไปแล้วข้อผิดพลาดชนิดที่คลุมเครือไม่สามารถอธิบายได้อย่างชัดเจนและเช่นนั้น - ในขณะที่ข้อบกพร่อง ... ข้อผิดพลาดคือความหมายโดยการจัดการรหัสด้วยตัวเอง พวกเขาไม่ได้มีข้อผิดพลาดพวกเขาบ่งบอกถึงการขาดตรรกะที่มันไม่ควรจะเป็น
tvCa

1
@NiklasRtz: ทำไมค่าหัวมหาศาล ผู้คนมากมายจะตอบโดยไม่คำนึงถึง
ThePopMachine

@ThePopMachine เพราะฉันชอบรางวัลมากมายสำหรับคำถามที่คนอื่น ๆ อาจพบว่าน่าสนใจ ฉันตอบคำถาม "ยอดนิยม" ของฉันและตอบคำถามให้มากที่สุด ฉันได้รับความช่วยเหลือจากคำถามและคำตอบที่ดีและสนุก ฉันกำลังเตรียมคำถามใหม่เกี่ยวกับการจัดการข้อผิดพลาดและรหัสข้อผิดพลาดสำหรับโปรแกรมเมอร์นี้ซึ่งไม่เฉพาะเจาะจงวิธีการเขียนโค้ด แต่วิธีจัดการกับข้อผิดพลาดในวิธีที่ จำกัด และหวังว่าจะเป็นมาตรฐานสำหรับ exmple สำหรับ webapps ที่สามารถส่งคืนจำนวน จำกัด รหัสข้อผิดพลาดความบกพร่องในการดีและการตั้งชื่อส่วนต่าง ๆ ของรหัส
Niklas

คำตอบ:


93

มันง่ายมาก: ไม่ใช่ข้อยกเว้นทั้งหมดที่เป็นข้อบกพร่อง (และในทำนองเดียวกันไม่ใช่ข้อยกเว้นทั้งหมดที่แสดงว่าเป็นข้อยกเว้น)

ตัวอย่างของข้อยกเว้นที่ไม่ใช่ข้อผิดพลาดหากคุณกำลังอ่านไฟล์จากไดรฟ์ USB และมีคนดึงไดรฟ์ออกจากซ็อกเก็ต นั่นจะเพิ่มข้อยกเว้น (ในภาษาส่วนใหญ่ที่สนับสนุนข้อยกเว้นนั่นคือ) แต่ไม่ใช่ข้อผิดพลาดในรหัส

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

ต้องบอกว่าข้อยกเว้นที่ทำให้มันไปจนถึงด้านบนสุดของสแต็กน่าจะเป็นบั๊ก ในตัวอย่าง USB ของฉันด้านบนคุณควรจะสามารถตรวจจับข้อยกเว้นนั้นและแสดงข้อผิดพลาดที่ดีให้กับผู้ใช้ที่พูดว่า "เราไม่สามารถอ่านจากไฟล์เพราะมันไม่ได้เชื่อมต่ออีกต่อไป" หรือบางสิ่งบางอย่าง. หากคุณเพียงแค่นำเสนอพวกเขาด้วยIOExceptionรหัสข้อผิดพลาดและขี้ขลาดแล้วนั่นคือข้อผิดพลาด แต่ข้อยกเว้นนั้นไม่ใช่


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

1
@Nicke: ใช่ฉันต้องการเห็นด้วย
Dean Harding

1
การแสดง IOException และรหัสข้อผิดพลาดไม่ใช่ข้อผิดพลาดเสมอไป มันคือการวินิจฉัย ฉันมักจะทำเช่นนั้นสำหรับสคริปต์ส่วนบุคคลซึ่งความล้มเหลวหมายถึงฉันใส่ข้อโต้แย้งที่ไม่ถูกต้อง
Thomas Eding

23

ธรรมดาและเรียบง่ายข้อยกเว้นไม่ใช่ข้อผิดพลาด (เสมอ)!

มีการโยนข้อยกเว้น (หรือควร) เมื่อมีสิ่งพิเศษเกิดขึ้น หากมีปัญหากับฮาร์ดไดรฟ์ของฉันและไม่สามารถเขียนไฟล์ได้แสดงว่าไม่ใช่ข้อผิดพลาด นั่นคือความล้มเหลวของฮาร์ดแวร์

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


1
เฮ้เราตอบไปเกือบจะในเวลาเดียวกันและโดยทั่วไปก็เป็นตัวอย่างเดียวกันเช่นกัน :-)
Dean Harding

5
@DeanHarding จิตใจที่ดีคิดเหมือนกันใช่ไหม? : D

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

1
@ScottWhitlock ฉันเดาว่า "บั๊ก" มีคำจำกัดความมากกว่าหนึ่งคำ ฉันมักจะคิดว่ามันหมายถึงข้อผิดพลาดที่เกิดจากมนุษย์: en.wikipedia.org/wiki/Software_bug

1
@ScottWhitlock: และโปรแกรมเมอร์ควรจะพูดว่า "ไม่ใช่ความผิดของฉันจะต้องเป็นข้อบกพร่อง" ซึ่งย้อนกลับมาเป็น "ข้อผิดพลาด" มาถึงความผิดพลาดของซอฟต์แวร์ วันนี้ความล้มเหลวของฮาร์ดแวร์จะไม่ถูกเรียกว่าข้อผิดพลาดถึงแม้ว่าข้อผิดพลาดอาจทำให้ฮาร์ดแวร์ล้มเหลว
jmoreno

20

พวกเขาไม่เหมือนกัน

ข้อผิดพลาดเป็นพฤติกรรมที่ไม่ได้ตั้งใจของชิ้นส่วนของซอฟต์แวร์: ซอฟแวร์ไม่ได้ทำสิ่งที่มันควรจะทำอย่างไร บั๊กสามารถอยู่ในทุกระดับของการพัฒนาซอฟต์แวร์ตั้งแต่การพิมพ์ผิดธรรมดาไปจนถึงข้อผิดพลาดเชิงตรรกะจนถึงรายละเอียดการทำงานที่ไม่เพียงพอ

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

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

ในทางกลับกันการมีบั๊กไม่จำเป็นต้องมีข้อยกเว้น แอปพลิเคชันอาจทิ้งข้อมูลที่คุณป้อนโดยไม่ต้องป้อนข้อมูลลงในฐานข้อมูล ไม่มีข้อยกเว้นเกิดขึ้น แต่ก็ยังเป็นข้อผิดพลาด


+1 สำหรับการกำหนดเงื่อนไขของคุณ โดยทั่วไปผู้คนควรทำเช่นนั้นบ่อยขึ้น!
yfeldblum

นี่คือคำตอบที่ชัดเจนที่สุดแน่นอน ชัดเจนและรัดกุม เยี่ยมมาก!
ล็อค

5

ข้อยกเว้นและข้อบกพร่องไม่เกี่ยวข้องเลย แน่นอนว่าบางครั้งคุณมีข้อผิดพลาดและมันหมายถึงข้อผิดพลาด แต่บางครั้งมันก็หมายถึงกรณีพิเศษที่ผิดปกติซึ่งไม่จำเป็นต้องเป็นข้อบกพร่องในโปรแกรมเลย โดยเฉพาะอย่างยิ่งในภาษาที่มีความสุขเช่นชวาที่ทุกการดำเนินการมาตรฐานและเป็นสุนัขโยนข้อยกเว้นที่แตกต่างกันประมาณห้าตัวอย่างเช่นการเปิดไฟล์ล้มเหลวการอ่านไฟล์ล้มเหลว ฯลฯ


3

ข้อยกเว้นไม่ได้เกี่ยวข้องกับบั๊กเสมอไป คิดว่ามันเป็นสิ่งที่อาจไปผิดกับสิ่งที่คุณทำ

ตัวอย่างที่นึกถึงคือ InetAddress.getByName () ซึ่งใช้เพื่อแก้ไขชื่อโดเมน หากมีบางสิ่งเกิดขึ้นและการโยน UnknownHostException ไม่ใช่ปัญหาเรื่องรหัสจริงๆ


2

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

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

ถ้าไม่มีการดีบักเกอร์จัดการข้อยกเว้นโอกาสครั้งที่สองแอปพลิเคชันจะปิดลง


2

คุณอาจยกข้อยกเว้นด้วยตัวเองอย่างถูกกฎหมายคุณหวังว่าจะไม่มีข้อผิดพลาดเกิดขึ้น


สิ่งนี้อ่านมากขึ้นเช่นความเห็นดูวิธีการตอบ
gnat

1
ความกะทัดรัดไม่ได้หมายความว่ามันไม่ใช่คำตอบที่เน้นความแตกต่างระหว่างสองสิ่ง
Alan B

1

ข้อยกเว้นทั้งหมดไม่ใช่ข้อบกพร่อง อาจเป็นหัวข้อถกเถียงว่าบั๊กทั้งหมดเป็นข้อยกเว้นหรือไม่

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

นี่คือตัวอย่างของวิธีการจัดการข้อยกเว้นอาจเป็นข้อผิดพลาด

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

ภาษาโปรแกรมการจับแมชชีนแบบ try try เป็นหลักเป็นเครื่องมือในการช่วยให้เราออกไปจัดการกับเหตุการณ์ที่ไม่คาดคิด


1

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

Resoning: ข้อผิดพลาดเป็นข้อบกพร่องในการออกแบบหรือการดำเนินงานของผลิตภัณฑ์ (ไม่ จำกัด เฉพาะซอฟต์แวร์) ตัวอย่างเช่นการไม่ใช้รีเลย์ที่ได้รับการจัดอันดับอย่างเหมาะสม (เวลา / ความไว / ความน่าเชื่อถือ / ความจุ) อาจเกิดจากข้อกำหนดที่ไม่ถูกต้องหรือข้อผิดพลาดในการสร้างอย่างง่าย ยกเว้นเป็น / วิ่งเบี่ยงเบนเวลาโลกจริงจากที่คาดการณ์ไว้ (ผมกล้าพูดว่า 'คาด'?) พฤติกรรมเช่นสูญเสียการควบคุมของรถในขณะขับรถ

เห็นได้ชัดว่าข้อผิดพลาดสามารถทำให้เกิดข้อยกเว้นตามตัวอย่างใน 1) อาจนำไปสู่ตัวอย่างใน 2) แต่ไม่ใช่ข้อยกเว้นทั้งหมดที่จะเกิดจากข้อบกพร่องเช่นการสูญเสียการควบคุมยานพาหนะเพราะผู้ประกอบการมีจังหวะ


0

เนื่องจากคำถามนี้ถูกเปิดใหม่อีกครั้งสำหรับเงินรางวัลให้ฉันพูดถึงบทความ CUJ ของฉันจากปี 2003 เรื่อง "ข้อยกเว้นหรือข้อผิดพลาด?" ซึ่งดูเหมือนว่าจะตอบคำถามของ OP อย่างแน่นอน

โดยทั่วไปบทความจะกำหนดคำว่า "บั๊ก" และ "ข้อยกเว้น" (ให้ตัวอย่าง) และเสนอกลยุทธ์สำหรับการจัดการกับแต่ละข้อ

บทความเสนอไม่ให้ "จัดการ" ข้อบกพร่อง แต่แทนที่จะตั้งค่าสถานะพวกเขาด้วยการยืนยัน ในทางตรงกันข้ามข้อยกเว้นที่แท้จริงต้องการการจัดการผ่านโค้ด (อาจเป็นข้อยกเว้นการขว้างปา / จับได้)

ประเด็นหลักคือข้อบกพร่องนั้นต้องการกลยุทธ์ตรงข้ามมากกว่าข้อยกเว้น

บทความดังกล่าวสามารถใช้ได้จาก Dr.Dobb ที่: http://www.drdobbs.com/an-exception-or-a-bug/184401686

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