หากเราอ้างถึงข้อยกเว้นว่าเป็นข้อบกพร่องทำไมไม่เรียกมันว่าบั๊กตั้งแต่แรกแทนที่จะเป็นข้อยกเว้น?
หากในรหัสเรียกว่าข้อยกเว้นและทันทีที่มันเกิดขึ้นจะเรียกว่าข้อผิดพลาด ถ้าอย่างนั้นทำไมไม่เรียกมันว่าบั๊กในตอนแรกล่ะ?
ขอบคุณสำหรับคำตอบหรือความคิดเห็น
หากเราอ้างถึงข้อยกเว้นว่าเป็นข้อบกพร่องทำไมไม่เรียกมันว่าบั๊กตั้งแต่แรกแทนที่จะเป็นข้อยกเว้น?
หากในรหัสเรียกว่าข้อยกเว้นและทันทีที่มันเกิดขึ้นจะเรียกว่าข้อผิดพลาด ถ้าอย่างนั้นทำไมไม่เรียกมันว่าบั๊กในตอนแรกล่ะ?
ขอบคุณสำหรับคำตอบหรือความคิดเห็น
คำตอบ:
มันง่ายมาก: ไม่ใช่ข้อยกเว้นทั้งหมดที่เป็นข้อบกพร่อง (และในทำนองเดียวกันไม่ใช่ข้อยกเว้นทั้งหมดที่แสดงว่าเป็นข้อยกเว้น)
ตัวอย่างของข้อยกเว้นที่ไม่ใช่ข้อผิดพลาดหากคุณกำลังอ่านไฟล์จากไดรฟ์ USB และมีคนดึงไดรฟ์ออกจากซ็อกเก็ต นั่นจะเพิ่มข้อยกเว้น (ในภาษาส่วนใหญ่ที่สนับสนุนข้อยกเว้นนั่นคือ) แต่ไม่ใช่ข้อผิดพลาดในรหัส
ในทางกลับกันข้อผิดพลาดอาจแสดงให้เห็นว่าเป็นข้อผิดพลาดในการคำนวณหรือบางสิ่งบางอย่าง คุณยังคงได้รับคำตอบไม่ใช่เพียงคำตอบที่ถูกต้อง
ต้องบอกว่าข้อยกเว้นที่ทำให้มันไปจนถึงด้านบนสุดของสแต็กน่าจะเป็นบั๊ก ในตัวอย่าง USB ของฉันด้านบนคุณควรจะสามารถตรวจจับข้อยกเว้นนั้นและแสดงข้อผิดพลาดที่ดีให้กับผู้ใช้ที่พูดว่า "เราไม่สามารถอ่านจากไฟล์เพราะมันไม่ได้เชื่อมต่ออีกต่อไป" หรือบางสิ่งบางอย่าง. หากคุณเพียงแค่นำเสนอพวกเขาด้วยIOException
รหัสข้อผิดพลาดและขี้ขลาดแล้วนั่นคือข้อผิดพลาด แต่ข้อยกเว้นนั้นไม่ใช่
ธรรมดาและเรียบง่ายข้อยกเว้นไม่ใช่ข้อผิดพลาด (เสมอ)!
มีการโยนข้อยกเว้น (หรือควร) เมื่อมีสิ่งพิเศษเกิดขึ้น หากมีปัญหากับฮาร์ดไดรฟ์ของฉันและไม่สามารถเขียนไฟล์ได้แสดงว่าไม่ใช่ข้อผิดพลาด นั่นคือความล้มเหลวของฮาร์ดแวร์
ข้อผิดพลาดโดยทั่วไปเป็นผลมาจากการเขียนโปรแกรมที่ไม่ดี หากแอปพลิเคชันทำสิ่งที่ไม่คาดว่าจะเกิดจากข้อผิดพลาดในการเขียนโปรแกรมนั่นเป็นข้อผิดพลาด
พวกเขาไม่เหมือนกัน
ข้อผิดพลาดเป็นพฤติกรรมที่ไม่ได้ตั้งใจของชิ้นส่วนของซอฟต์แวร์: ซอฟแวร์ไม่ได้ทำสิ่งที่มันควรจะทำอย่างไร บั๊กสามารถอยู่ในทุกระดับของการพัฒนาซอฟต์แวร์ตั้งแต่การพิมพ์ผิดธรรมดาไปจนถึงข้อผิดพลาดเชิงตรรกะจนถึงรายละเอียดการทำงานที่ไม่เพียงพอ
ยกเว้นโดยคมชัดสามารถดูได้ทั้งสภาพผิดปกติของโปรแกรมที่เบี่ยงเบนไปจากการดำเนินงานปกติหรือมากขึ้นโดยเฉพาะการสร้างภาษาที่ใช้ในการส่งสัญญาณและจัดการกับเงื่อนไขดังกล่าว
ความจริงที่ว่าข้อยกเว้นเกิดขึ้นอาจเป็นสัญญาณของข้อผิดพลาด แต่บ่อยครั้งที่มันไม่ใช่ ตัวอย่างเช่นแอปพลิเคชันที่คาดว่าจะดาวน์โหลดเอกสารจาก URL และประมวลผลภายในอาจทำให้เกิดข้อยกเว้นเมื่อเซิร์ฟเวอร์ระยะไกลไม่ทำงาน: แอปพลิเคชันเบี่ยงเบนจากการทำงานปกติ (ไม่สามารถดาวน์โหลดและประมวลผลเอกสาร) แต่ถ้าเป็น จัดการข้อยกเว้นอย่างถูกต้องและกู้คืนจากนั้นไม่มีข้อผิดพลาด
ในทางกลับกันการมีบั๊กไม่จำเป็นต้องมีข้อยกเว้น แอปพลิเคชันอาจทิ้งข้อมูลที่คุณป้อนโดยไม่ต้องป้อนข้อมูลลงในฐานข้อมูล ไม่มีข้อยกเว้นเกิดขึ้น แต่ก็ยังเป็นข้อผิดพลาด
ข้อยกเว้นและข้อบกพร่องไม่เกี่ยวข้องเลย แน่นอนว่าบางครั้งคุณมีข้อผิดพลาดและมันหมายถึงข้อผิดพลาด แต่บางครั้งมันก็หมายถึงกรณีพิเศษที่ผิดปกติซึ่งไม่จำเป็นต้องเป็นข้อบกพร่องในโปรแกรมเลย โดยเฉพาะอย่างยิ่งในภาษาที่มีความสุขเช่นชวาที่ทุกการดำเนินการมาตรฐานและเป็นสุนัขโยนข้อยกเว้นที่แตกต่างกันประมาณห้าตัวอย่างเช่นการเปิดไฟล์ล้มเหลวการอ่านไฟล์ล้มเหลว ฯลฯ
ข้อยกเว้นไม่ได้เกี่ยวข้องกับบั๊กเสมอไป คิดว่ามันเป็นสิ่งที่อาจไปผิดกับสิ่งที่คุณทำ
ตัวอย่างที่นึกถึงคือ InetAddress.getByName () ซึ่งใช้เพื่อแก้ไขชื่อโดเมน หากมีบางสิ่งเกิดขึ้นและการโยน UnknownHostException ไม่ใช่ปัญหาเรื่องรหัสจริงๆ
ข้อผิดพลาดของซอฟต์แวร์เป็นคำทั่วไปที่ใช้เพื่ออธิบายข้อผิดพลาดข้อผิดพลาดความผิดพลาดความผิดพลาดหรือความผิดพลาดในโปรแกรมคอมพิวเตอร์หรือระบบที่ให้ผลลัพธ์ที่ไม่ถูกต้องหรือไม่คาดคิดหรือทำให้มันทำงานในรูปแบบที่ไม่ได้ตั้งใจ อาจเป็นความผิดพลาดในการสะกดคำบนฉลาก
ข้อยกเว้นแตกต่างจากข้อบกพร่อง ข้อยกเว้นแต่ละประเภท (การละเมิดการเข้าถึงการล้นสแต็กและอื่น ๆ ) สามารถยกขึ้นไปยังดีบักเกอร์เป็นข้อยกเว้น "โอกาสแรก" หรือ "โอกาสครั้งที่สอง" ข้อยกเว้นโอกาสแรกคือตามคำนิยามไม่ร้ายแรงยกเว้นว่าพวกเขาจะไม่ได้รับการจัดการอย่างถูกต้องด้วยตัวจัดการข้อผิดพลาด ณ จุดที่พวกเขาถูกยกขึ้นอีกครั้งเป็นข้อยกเว้นโอกาสครั้งที่สอง
ถ้าไม่มีการดีบักเกอร์จัดการข้อยกเว้นโอกาสครั้งที่สองแอปพลิเคชันจะปิดลง
คุณอาจยกข้อยกเว้นด้วยตัวเองอย่างถูกกฎหมายคุณหวังว่าจะไม่มีข้อผิดพลาดเกิดขึ้น
ข้อยกเว้นทั้งหมดไม่ใช่ข้อบกพร่อง อาจเป็นหัวข้อถกเถียงว่าบั๊กทั้งหมดเป็นข้อยกเว้นหรือไม่
เราสามารถพูดได้ว่าข้อยกเว้นเป็นเหตุการณ์ที่ไม่ได้เป็นส่วนหนึ่งของการไหลปกติหรือคาดว่าการประยุกต์ใช้ เหตุการณ์เหล่านี้สามารถเป็นอิสระจากวิธีการเขียนรหัสที่เป็นข้อผิดพลาดเป็นผลมาจากรหัสที่ไม่ดี (เช่นการคำนวณผิด)
นี่คือตัวอย่างของวิธีการจัดการข้อยกเว้นอาจเป็นข้อผิดพลาด
ให้เราสมมติว่ามีโปรแกรมที่เขียนข้อมูลบางอย่างไปยังอุปกรณ์จัดเก็บข้อมูลภายนอก ในขณะที่กำลังเขียนอุปกรณ์จัดเก็บข้อมูลภายนอกถูกถอดปลั๊กขัดข้องหรืออาจถูกทำลาย (ด้วยเหตุผลใดก็ตาม) ตอนนี้เป็นกรณีพิเศษตอนนี้ไม่ว่าภาษาการเขียนโปรแกรมรองรับการจัดการที่ยอดเยี่ยมหรือไม่ถ้าโปรแกรมขัดข้องหรือทำงานผิดปกติเนื่องจากเหตุการณ์นี้มันเป็นข้อผิดพลาด (ผู้ใช้ปลายทางอาจไม่ทราบว่าเกิดอะไรขึ้น . แต่ถ้าโปรแกรมยกเลิกกระบวนการอย่างนุ่มนวลแจ้งผู้ใช้ (ในคำอื่น ๆ จัดการ exeption) นี่ไม่ใช่ข้อผิดพลาดอย่างชัดเจน
ภาษาโปรแกรมการจับแมชชีนแบบ try try เป็นหลักเป็นเครื่องมือในการช่วยให้เราออกไปจัดการกับเหตุการณ์ที่ไม่คาดคิด
เรื่องย่อ : ข้อยกเว้นเป็นหลักฐานของผลลัพธ์ที่ไม่ดีข้อบกพร่องคือสาเหตุของผลลัพธ์ที่ไม่ดี ปัญหา (ที่จะแก้ไข) ไม่ใช่ข้อยกเว้นปัญหาคือสิ่งที่ทำให้เกิดข้อยกเว้น
Resoning: ข้อผิดพลาดเป็นข้อบกพร่องในการออกแบบหรือการดำเนินงานของผลิตภัณฑ์ (ไม่ จำกัด เฉพาะซอฟต์แวร์) ตัวอย่างเช่นการไม่ใช้รีเลย์ที่ได้รับการจัดอันดับอย่างเหมาะสม (เวลา / ความไว / ความน่าเชื่อถือ / ความจุ) อาจเกิดจากข้อกำหนดที่ไม่ถูกต้องหรือข้อผิดพลาดในการสร้างอย่างง่าย ยกเว้นเป็น / วิ่งเบี่ยงเบนเวลาโลกจริงจากที่คาดการณ์ไว้ (ผมกล้าพูดว่า 'คาด'?) พฤติกรรมเช่นสูญเสียการควบคุมของรถในขณะขับรถ
เห็นได้ชัดว่าข้อผิดพลาดสามารถทำให้เกิดข้อยกเว้นตามตัวอย่างใน 1) อาจนำไปสู่ตัวอย่างใน 2) แต่ไม่ใช่ข้อยกเว้นทั้งหมดที่จะเกิดจากข้อบกพร่องเช่นการสูญเสียการควบคุมยานพาหนะเพราะผู้ประกอบการมีจังหวะ
เนื่องจากคำถามนี้ถูกเปิดใหม่อีกครั้งสำหรับเงินรางวัลให้ฉันพูดถึงบทความ CUJ ของฉันจากปี 2003 เรื่อง "ข้อยกเว้นหรือข้อผิดพลาด?" ซึ่งดูเหมือนว่าจะตอบคำถามของ OP อย่างแน่นอน
โดยทั่วไปบทความจะกำหนดคำว่า "บั๊ก" และ "ข้อยกเว้น" (ให้ตัวอย่าง) และเสนอกลยุทธ์สำหรับการจัดการกับแต่ละข้อ
บทความเสนอไม่ให้ "จัดการ" ข้อบกพร่อง แต่แทนที่จะตั้งค่าสถานะพวกเขาด้วยการยืนยัน ในทางตรงกันข้ามข้อยกเว้นที่แท้จริงต้องการการจัดการผ่านโค้ด (อาจเป็นข้อยกเว้นการขว้างปา / จับได้)
ประเด็นหลักคือข้อบกพร่องนั้นต้องการกลยุทธ์ตรงข้ามมากกว่าข้อยกเว้น
บทความดังกล่าวสามารถใช้ได้จาก Dr.Dobb ที่: http://www.drdobbs.com/an-exception-or-a-bug/184401686