‫ยินดีต้อนรับกลับ.
‫ในวิดีโอนี้ ในที่สุดเราจะแก้ไขปัญหาที่เรามีในโปรแกรมของเรา นี่คือโปรแกรมเสมือนที่เราสร้างขึ้น
‫และเราจะพิจารณาโปรแกรมป้องกันด้วย
‫แนวความคิดของการเขียนโปรแกรมป้องกันก็คือการสร้างรหัสความปลอดภัยที่คิดไว้แล้วจริงๆ ว่าจะมีปัญหาอะไรเกิดขึ้น
‫เพราะในกรณีนี้ ปัญหาที่อาจเกิดขึ้นคือ รายชื่อว่าง หรือเราต้องการมีเพื่อนมากเกินไป
‫ดังนั้นเราจึงต้องการเชิญเพื่อนมากกว่าที่เรามี
‫และในกรณีนี้ รายการเป็นแบบง่ายๆ ที่เราสร้างขึ้นด้วยตนเอง
‫แต่ลองนึกดูว่ามาจากฐานข้อมูล
‫ดังนั้นมันจึงมาจากฐานข้อมูลหรือมาจากเว็บ จากฐานข้อมูลบนคลาวด์หรืออะไรทำนองนั้น
‫แล้วมันจะเป็นเรื่องราวที่แตกต่างอย่างมากเพราะเราไม่มีทางรู้ว่ารายการใหญ่แค่ไหนในกรณีนี้
‫เราสามารถเห็นมันในรหัส แต่เราอาจไม่รู้ว่ามันมาจากไหน
‫ในกรณีนี้ เราต้องคาดการณ์ปัญหาต่าง ๆ ที่อาจเกิดขึ้น และเราสามารถทดสอบด้วยตนเองเมื่อพัฒนา
‫เช่น เราเคยทำมาแล้วใช่ไหม?
‫เราป้อนเพื่อนเพิ่มเติมที่เรามีในรายการ
‫ดังนั้นจึงเป็นเรื่องง่าย
‫เราเพียงแค่เรียกใช้สิ่งนี้แล้วเราก็ได้อาร์กิวเมนต์นี้นอกขอบเขตข้อยกเว้น
‫แต่ที่เราได้รับมันเป็นสิ่งที่น่าสนใจ
‫ดังนั้นเราจึงได้รับมันที่จุดของวิธีการปาร์ตี้ที่แตกต่างกันแม้ว่าปัญหาจะอยู่ที่อื่น
‫เพราะถ้าเราดูมันบอกว่ารายชื่อที่สั้นที่สุดเป็นศูนย์
‫ดังนั้นเราจึงพยายามเข้าถึงองค์ประกอบรายการที่ไม่พร้อมใช้งานเนื่องจากเราผ่านรายการ หาเพื่อนปาร์ตี้
‫และเราส่งรายการนี้ที่นี่
‫ดังนั้นหากเราดูว่าเราได้รายการนี้มาจากไหน นั่นอาจเป็นจุดเริ่มต้นที่ดี เพราะเราจะเห็นได้ว่าเรากำลังพยายามเข้าถึงบางสิ่งที่ไม่สามารถใช้ได้
‫แล้วอะไรคือปัญหากับสิ่งที่มีให้?
‫เราสามารถดูบรรทัดนี้ได้ที่นี่ รับเพื่อนปาร์ตี้
‫นั่นแหละที่เรียกว่า
‫และเราสามารถเห็นได้
‫เอาล่ะ นั่นคือบัฟเฟอร์
‫ใช่ไหม
‫เราจึงได้บัฟเฟอร์ ซึ่งก็คือรายการนี้ตรงนี้
‫สิ่งที่เราได้รับคือรายการจากระดับบนสุด
‫อีกครั้งที่เราเห็น เอาละ เราได้รายชื่อคนจำนวนมากแบบนี้ และนี่คือที่ที่เราได้รับคุณค่า
‫และจุดที่ดีในการตรวจสอบว่ารายการนั้นดีจริง ๆ แล้วในวิธี Get Party Friends ของเราหรือไม่ เพราะที่นี่เราได้รายชื่อแล้ว
‫ณ จุดนี้เรามีรายการเพื่อให้เราสามารถตรวจสอบรายการนี้ได้
‫เราสามารถดูว่ารายการนี้ดีพอสำหรับสิ่งที่เราต้องการจะทำหรือไม่
‫และสิ่งที่เราต้องการจะทำคือการเขียนบางอย่างตามบัญชีขององค์ประกอบในรายการนั้น
‫เพื่อให้เราสามารถตรวจสอบว่าการนับนั้นมากกว่าการนับจุดรายการหรือไม่
‫และนี่คือรายการที่ส่งถึงเรา
‫ดังนั้นหากเป็นกรณีนี้ สิ่งที่เราทำได้คือเราพิมพ์อะไรบางอย่างได้ อย่าทำอย่างนั้นหรือผิดพลาดหรืออะไรทำนองนั้น
‫แต่สิ่งที่ดีกว่าที่เราสามารถทำได้คือทำให้โปรแกรมหยุดทำงาน
‫เราจึงรู้ว่าโปรแกรมมีปัญหา แต่ในขณะเดียวกัน เราก็หยุดโปรแกรมไม่ให้ทำงานตั้งแต่เริ่มต้น เพราะลองนึกภาพว่าเรามีการเชื่อมต่อกับฐานข้อมูล
‫และตอนนี้เรากำลังสร้างข้อผิดพลาดต่างๆ เหล่านี้ทั้งหมดหรือ แค่อ่านโค้ดและวิธีนี้ทำให้เพื่อนปาร์ตี้ทำงาน
‫สมมุติว่ามันเชื่อมต่อกับฐานข้อมูลและเขียนบางอย่างลงในฐานข้อมูล จากนั้นเราจะรันโค้ดอีกครั้ง
‫และด้วยเหตุผลบางอย่าง สถานะของฐานข้อมูลจึงเปลี่ยนไป และตอนนี้เรารู้สึกประหลาดใจเพราะข้อมูลที่แสดงให้เราเห็นว่าเป็นเรื่องไร้สาระทั้งหมด
‫และเราไม่สามารถดำเนินการกับข้อมูลดังกล่าวได้
‫ดังนั้นการแก้ไขข้อผิดพลาดนั้นจะเป็นปัญหาที่แท้จริง
‫ไม่เป็นไร.
‫ดังนั้นเราจึงสามารถจับมันได้โดยเร็วที่สุดเพื่อให้เราสามารถโยนอาร์กิวเมนต์นอกช่วงข้อยกเว้นได้ที่นี่
‫ดังนั้นให้โยนอาร์กิวเมนต์ใหม่นอกขอบเขตเพราะนั่นคือสิ่งที่เราทำถูกต้อง
‫และอาร์กิวเมนต์ที่มีข้อยกเว้นนั้นมีการโอเวอร์โหลดหลายครั้ง
‫เราก็จะได้อันนี้พร้อมชื่อพารามิเตอร์
‫เราสามารถมีข้อความที่มีข้อยกเว้นหรือชื่อพารามิเตอร์พร้อมข้อความ
‫ตรงนี้ผมพูดได้ประมาณว่า โอเค การนับคือปัญหา และการนับต้องไม่มากกว่าองค์ประกอบในรายการหรืออะไรทำนองนั้น
‫นั่นจะเป็นตัวอย่างสำหรับสิ่งที่เราสามารถแสดงได้
‫ลองเรียกใช้อีกครั้งเพราะตอนนี้เราควรจะสามารถตรวจจับข้อผิดพลาดนี้ได้จริงหรืออย่างน้อยก็โยนอาร์กิวเมนต์นอกขอบเขตเมื่อเราได้รับข้อผิดพลาดนี้
‫ไม่เป็นไร.
‫ดังนั้นเราจึงเห็นข้อยกเว้นในการจัดการ โดยระบุว่าอาร์กิวเมนต์ของระบบอยู่นอกช่วง ข้อยกเว้นไม่สามารถมากกว่าองค์ประกอบในการนับพารามิเตอร์รายการ
‫นั่นคือผลลัพธ์ของสิ่งที่เราเขียนที่นี่
‫นี่คือลักษณะของข้อยกเว้น
‫ตอนนี้เรารู้แล้วว่าปัญหาคืออะไร
‫มันแสดงออกมากขึ้นเล็กน้อย
‫ก่อนที่ปัญหาจะไม่เกิดขึ้นจริงที่นี่
‫ให้ฉันแสดงความคิดเห็นสองบรรทัดนั้น
‫ปัญหานี้ไม่ได้ถูกโยนทิ้งไป ณ จุดนี้ แต่มันถูกโยนทิ้งลงไปอีก
‫มันถูกโยนในวิธีการที่แตกต่างกันของเรา
‫มันอยู่ในบรรทัดที่ 42
‫แต่ปัญหาที่เกิดขึ้นจริงเกิดขึ้นเร็วกว่านี้มาก
‫ถูกต้อง.
‫และดัชนีอยู่นอกช่วงข้อยกเว้น
‫นั่นเป็นคำกล่าวที่ธรรมดามากเช่นกัน
‫จะเป็นอะไรก็ได้
‫ถูกต้อง.
‫ดังนั้นการรู้ไว้ก่อนจะช่วยให้เราเห็นว่าปัญหาของเราอยู่ที่ไหน
‫แน่นอน สิ่งที่เราทำได้คือบอกว่า โอเค เมื่อเราป้อนค่านี้แล้วสมมุติว่าค่านี้มาจากผู้ใช้ที่ป้อนค่า
‫จริงไหม?
‫ดังนั้นคุณสามารถป้อนค่าใดก็ได้ตั้งแต่ศูนย์จนถึงจำนวนองค์ประกอบรายการที่เรามี
‫ดังนั้นเราจึงสามารถจับมันได้ก่อนหน้านี้
‫เราสามารถทำการทดสอบได้แม้กระทั่งที่นี่
‫ดังนั้นหาก.
‫เพื่อน.
‫การนับจุดคือ
‫น้อยกว่าค่าที่เราป้อนที่นี่ และเราสามารถรับค่านี้อีกครั้งจากผู้ใช้
‫ถ้าอย่างนั้นเราก็สามารถส่งข้อความถึงพวกเขาได้ใช่ไหม?
‫เราจะไม่โยนข้อยกเว้นของเรา
‫เราจะไม่ทำให้โปรแกรมของเราพัง
‫เราจะขอให้ผู้ใช้ป้อนค่าใหม่
‫แต่เราไม่ได้ทำที่นี่เพราะเราในฐานะโปรแกรมเมอร์สามารถป้อนค่าที่นี่ และเราบังคับใช้ข้อผิดพลาดเหล่านี้ด้วยตนเองทันที
‫ถูกต้อง.
‫นั่นเป็นวิธีหนึ่งในการแก้ปัญหาหรือวิธีหนึ่งที่จะจับมันให้ได้ตั้งแต่เนิ่นๆ
‫ทีนี้มาว่ากัน
‫เราป้อนค่าโง่ที่นี่ เช่น ลบหนึ่ง
‫เอาล่ะ เรียกใช้อีกครั้ง
‫อันที่จริง ให้เรียกใช้อีกครั้ง
‫และดูเหมือนว่าโปรแกรมของเราใช้งานได้ แต่มันไม่แสดงอะไรเลย
‫เลยไม่ได้แสดงอะไรออกมา
‫ข้อผิดพลาดไม่ได้ทำให้เกิดข้อผิดพลาด แต่ไม่แสดงให้เพื่อนเห็น
‫ดูเหมือนว่าโปรแกรมของเราจะใช้ค่าลบหนึ่งเพราะเราพยายามดึงองค์ประกอบรายการลบหนึ่งรายการออกจากรายการของเรา
‫แต่ก็ไม่ได้ให้ข้อมูลอันมีค่าแก่เราเลย
‫แน่นอน ตอนนี้สิ่งที่เราทำได้คือ เราสามารถบวกเงื่อนไขอื่นตรงนี้ได้
‫การนับควรมากกว่าเท่ากับศูนย์
‫หากไม่เป็นเช่นนั้น เราก็สามารถเขียนสิ่งที่เรียกว่าไม่สามารถมากกว่าองค์ประกอบในรายการหรือศูนย์ที่ต่ำกว่า
‫นั่นเป็นเพียงวิธีหนึ่งในการแสดงออก
‫และตอนนี้ถ้าเราเรียกใช้อีกครั้ง เราจะโยนข้อผิดพลาดนี้
‫นั่นคือสิ่งที่โปรแกรมไม่เคยโยนลูกศรมาก่อน แต่ตอนนี้เราในฐานะนักพัฒนาเข้าใจ โอเค นี่คือสถานะที่เราไม่ต้องการมี
‫นี่เป็นสถานการณ์ที่เราไม่ต้องการทำงานด้วย
‫และอย่างที่ฉันพูด เราจะตัดให้ดี เราจะพยายามหาค่านี้จากที่ไหนสักแห่งและเราจะพยายามจับมันให้ได้ก่อนหน้านั้นเสียอีก
‫ทีนี้ สมมติว่าเรามีสถานการณ์ที่สนุกกว่า
‫ดังนั้นเราจึงมีสถานการณ์ที่รายชื่อเพื่อนของฉันว่างเปล่า
‫ดังนั้นฉันจะสร้างรายการว่างที่นี่
‫ถูกใจ ตอนนี้จะถูกแสดงความคิดเห็น และตอนนี้เรามีรายการที่ว่างเปล่านี้
‫ลองเรียกใช้อีกครั้งและดูว่าโปรแกรมของเรายังใช้งานได้หรือไม่
‫และตอนนี้เรายังคงได้รับข้อโต้แย้งของเรานอกขอบเขต
‫มันเจ๋งมาก
‫ดูเหมือนว่าข้อยกเว้นที่เราสร้างขึ้นที่นี่จะแก้ไขปัญหานี้ได้ เราจึงไม่ต้องตรวจสอบด้วยตนเองว่ารายการเป็นอย่างไรแม้ว่าจะว่างเปล่าใช่ไหม
‫ดังนั้นถ้าเราดูรายชื่อเพื่อนของเรา รายชื่อเพื่อนจะว่างเปล่า แต่สุดท้ายเราจะนับเป็นศูนย์
‫ดังนั้นแม้ว่ารายการจะเป็นโมฆะ รายการก็ยังเป็นศูนย์
‫ค่าที่เราได้รับยังคงเป็นศูนย์
‫แต่นั่นไม่ใช่ทั้งหมดที่เราบังคับค่า null ได้
‫ดังนั้น แทนที่จะส่งต่อฝรั่งเศสกับฝรั่งเศส ซึ่งเป็นรายการว่าง เราสามารถส่งต่อค่าว่างได้ที่นี่
‫สมมติว่าด้วยเหตุผลบางอย่างเราไม่สามารถสร้างรายการนี้ได้เนื่องจากการเชื่อมต่อฐานข้อมูลไม่ทำงานหรืออะไรทำนองนั้น
‫และเราได้รับค่า null และตอนนี้เรากำลังส่งค่า null และเราพยายามส่งค่า null ไปยังวิธีการที่ ที่จริงต้องมีรายการ
‫เรามาลองใช้งานกันดู ว่าครั้งนี้เราผิดพลาดอะไรไปบ้าง
‫ดังนั้นตอนนี้เราได้รับการอ้างอิงอ็อบเจ็กต์ข้อยกเว้นการอ้างอิง null ที่ไม่ได้ตั้งค่าเป็นอินสแตนซ์ของรายการอ็อบเจ็กต์เป็นโมฆะ
‫ดังนั้นรายการที่เราผ่านตอนนี้คือตอนนี้
‫ดังนั้นเราจึงได้รับข้อผิดพลาดนี้ก่อนที่เราจะสามารถโยนข้อผิดพลาดได้
‫แน่นอน สิ่งที่เราสามารถทำได้คือ เราสามารถจับสถานการณ์นี้ได้เช่นกัน
‫ดังนั้นเราจึงสามารถเขียนคำสั่ง if ต่อไปได้
‫หากรายการเป็นค่าว่าง ให้โยนตัวชี้ค่าว่าง
‫ข้อยกเว้นโยนอาร์กิวเมนต์ใหม่
‫ข้อยกเว้น NULL
‫รายการดังนั้น
‫รายการว่างเปล่า
‫ไม่เป็นไร.
‫แน่นอน คุณสามารถอธิบายเพิ่มเติมได้ที่นี่ แทนที่จะต้องเว้นรายการ
‫โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตหรืออะไรทำนองนั้น
‫อาจเป็นการเชื่อมต่ออินเทอร์เน็ตหรือที่ใดก็ตามที่คุณได้รับข้อมูล
‫เลยลองเรียกใช้อีกครั้ง
‫และตอนนี้เราควรโยนอาร์กิวเมนต์ของเราตอนนี้ยกเว้น
‫อย่างที่คุณเห็น รายการเป็นรายการพารามิเตอร์ที่ว่างเปล่า
‫สมบูรณ์แบบ.
‫ไม่เป็นไร.
‫ตอนนี้ คุณอาจสงสัยว่าทำไมเราถึงทำทั้งหมดนี้?
‫ฉันไม่ต้องการให้โปรแกรมของฉันพังตลอดเวลา
‫เราทำสิ่งนี้เพื่อไม่ให้โปรแกรมของเราเข้าสู่สถานะที่จะเปลี่ยนแปลงบางสิ่งในฐานข้อมูล
‫เราไม่ได้เปลี่ยนแปลงอะไรในฐานข้อมูล ในโปรแกรมเล็กๆ ของเรา
‫แต่ลองนึกภาพว่ามันจะเป็นอย่างนั้น
‫เป็นสถานการณ์ที่แตกต่างกันมาก และเราสามารถสร้างปัญหาร้ายแรงบางอย่างได้ที่นี่
‫ตอนนี้ ฉันต้องการแสดงสิ่งสุดท้ายให้คุณดู เพราะก่อนหน้านี้เรามีทั้งหมดนี้แล้วใช่ไหม
‫ก่อนที่เราจะมี this if statement, this one and that one และอื่นๆ, และก่อนที่เราจะมีรายชื่อเพื่อนนี้.
‫ใช่ ฉันหยุดได้จริงๆ
‫เอ่อ ก่อนที่เราจะมีเพื่อนคนนี้ที่นี่ และเราก็ส่งเพื่อนไปที่นั่น จากนั้นเราก็พยายามมีเพื่อนสิบคนในงานปาร์ตี้ของเรา
‫แต่เรามีเพื่อนแค่เจ็ดคนเท่านั้น
‫ในสถานการณ์นี้ เมื่อเราเรียกใช้สิ่งนี้ เราสามารถทำได้คือ เราสามารถบังคับข้อผิดพลาดที่เรามี และข้อผิดพลาดอยู่ในการรับเพื่อนปาร์ตี้ของเรา
‫ดังนั้นเราจึงได้รับอาร์กิวเมนต์นี้อยู่นอกช่วง ดัชนีข้อยกเว้นอยู่นอกช่วง
‫นั่นคือปัญหาที่เรามีก่อนที่เราจะแก้ไข
‫ถูกต้อง.
‫แต่ตอนนี้ สิ่งที่น่าสนใจที่เราสามารถดูได้คือ call stack
‫ดังนั้นจึงมีสิ่งที่เรียกว่า call stack
‫และขอผมทำให้มันใหญ่ขึ้นหน่อยที่นี่
‫อันที่จริง ให้ฉันปิดทั้งหมดเหล่านั้นลง
‫ทีนี้มาดู call stack กัน
‫สแต็กการโทรนี้บอกว่าขณะนี้เราอยู่ในบรรทัดที่ 46
‫ไม่เป็นไร.
‫นั่นคือที่ที่เราอยู่
‫ดังนั้นเราจึงอยู่ในวิธีรับเพื่อนปาร์ตี้
‫ทีนี้ถ้าเราขึ้นไปอีกขั้นหนึ่งจะเห็นว่านี่คือที่เรียกวิธีการปาร์ตี้เพื่อน
‫ตอนนี้เราอยู่ในวิธีพหูพจน์รับเพื่อนปาร์ตี้
‫และถ้าอยากรู้ว่าวิธีนี้เรียกว่าอะไร?
‫มันเรียกในบรรทัดที่ 13
‫ดังนั้นด้วย call stack เราจะสามารถเห็นได้จากที่ที่เราถูกเรียก จากที่ที่เราถูกเรียกอีกครั้งและอื่นๆ
‫ดังนั้นเราจึงสามารถขึ้นไปถึงระดับที่เราเรียกว่าวิธีการเริ่มต้น
‫และวิธีแรกคือการเรียกเพื่อนปาร์ตี้
‫จากนั้นเราไปที่ wild loop นี้ จากนั้นให้เรียก party friend จากนั้นเราก็เข้าสู่
‫method นี้ และสุดท้ายตัวแปรของเราก็ถูกสร้างขึ้นตามรายการที่ว่างเปล่า
‫เอาล่ะ ฉันหวังว่าข้อมูลนี้จะแนะนำคุณเกี่ยวกับการดีบักเล็กน้อย
‫แน่นอนว่ายังมีอีกมากที่ต้องรู้ แต่ฉันไม่อยากทำให้คุณเบื่อกับรายละเอียดทั้งหมด
‫เพราะบางสิ่งมีประโยชน์ แต่หลายๆ อย่างไม่จำเป็นในชีวิตประจำวันของคุณ
‫เพราะฉันหมายถึง โดยทั่วไปแล้ว คุณสามารถไปข้างหน้าเพื่อแก้ไขจุดบกพร่อง จากนั้นตรวจสอบหน้าต่างต่าง
‫ๆ ทั้งหมดที่คุณได้รับที่นี่ และคุณสามารถดูเธรดที่กำลังทำงานและขนานกับกระบวนการและอื่น
‫ๆ .
‫แต่ฉันคิดว่าสิ่งที่คุณได้เห็นในตอนนี้จะเป็นส่วนหลักจริงๆ หรือจะเป็นสิ่งสำคัญที่คุณต้องการ
‫ซึ่งเป็นเครื่องมือหลักที่คุณต้องการเพื่อแก้ไขจุดบกพร่องของซอฟต์แวร์ของคุณ
‫ไม่เป็นไร.
‫ดังนั้น ฉันหวังว่าคุณจะสนุกกับมัน และฉันหวังว่าคุณจะสามารถใช้สิ่งนี้ในโปรแกรมในอนาคตของคุณ
‫และตอนนี้คุณก็สามารถดูวิธีการแก้ไขจุดบกพร่องได้แล้ว
‫และอีกอย่าง ขอบคุณที่ให้ข้อเสนอแนะนี้ เพราะฉันได้รับคำติชมว่าส่วนการดีบักหายไป ดังนั้นฉันจึงตัดสินใจสร้างส่วนเล็กๆ
‫นี้
‫ขอบคุณมากสำหรับความคิดเห็น
‫หากคุณมีอะไรที่คิดว่าขาดหายไปในหลักสูตรนี้หรือหากคุณคิดว่ามีบางอย่างที่แย่มาก โปรดอย่าให้คะแนนที่แย่กับฉันโดยตรง
‫แต่แจ้งให้เราทราบว่ามันคืออะไร ฉันจะได้ปรับปรุงหลักสูตรเพราะเป้าหมายของฉันคือ เพื่อให้เป็นหลักสูตร C-sharp
‫ที่ดีที่สุดในตลาด
‫ขอบคุณมากสำหรับความช่วยเหลือของคุณ และเราหวังว่าจะได้พบคุณในวิดีโอหน้า