หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
การจัดการข้อยกเว้น
ข้อยกเว้นที่กำหนดเอง
วัตถุประสงค์
ใช้งาน custom exceptions เพื่อรวบรวมข้อความที่เกี่ยวกับคำสั่งซื้อสินค้าและส่งออกไปผ่านนกพิราบขนส่ง
มีบางข้อความที่ถูกส่งไปทั่วฟาร์มและสถานีอื่นๆ โดยใช้นกพิราบส่งข้อความ มันน่าจะเป็นความคิดที่ดีที่จะส่งออกข้อความบางส่วนเพื่อให้ทันต่อกำหนดเวลา เราได้จับข้อผิดพลาดโดยใช้ exceptions ทั่วไปมาแล้ว แต่บางครั้งคุณอาจได้รับประโยชน์จากการสร้าง custom exceptions ของตัวเองสำหรับสถานการณ์ที่เฉพาะเจาะจง เราจะค้นหาข้อความและเลือกนกพิราบโดยการระบุสิ่งที่ถูกต้องด้วยการใช้งาน custom exceptions ของเราเอง
Custom exceptions ถูกจัดขึ้นโดยการสร้างคลาส โดยการเพิ่มส่วน (Exception) คุณสามารถนำคลาสมาใช้ใหม่สำหรับจัดการ exceptions สำหรับวัตถุประสงค์ของเรา เราจะสร้างสองตัว ได้แก่ InvalidLocation ซึ่งจะถูกกระตุ้นขึ้นเมื่อสตริงเฉพาะไม่ผ่านการตรวจสอบ และ UnsuitableSelection ซึ่งใช้เพื่อตรวจสอบว่าตัวเลขเกินค่าที่กำหนดหรือไม่
class InvalidLocation(Exception):
"Raised when location is invalid"
pass
class UnsuitableSelection(Exception):
"Raised when pidgeon is 2 or younger"
pass
ตอนนี้เมื่อคลาสถูกตั้งค่าแล้ว ถึงเวลาที่จะไปรวบรวมบันทึกข้อความเพื่อที่จะส่งออกไป สร้างรายการ (list) ชื่อ prep เพื่อเก็บและรวมส่วนประกอบที่จำเป็นสำหรับการแลกเปลี่ยนในครั้งถัดไป เดินไปยังจุด X สีเข้มเหนือพรมแดง บนชุดของโต๊ะที่มีเครื่องหมาย X อยู่ด้านหน้า เราจะค้นหาบันทึกข้อความที่มีคำสั่งซื้อสำหรับภาคตะวันตกของฟาร์ม
มีค่าคงที่ตัวแปร (variable constants) สี่ตัวที่ใช้ในส่วนนี้: red_memo, blue_memo, green_memo และ orange_memo เฉพาะบันทึกข้อความที่ถูกระบุให้ส่งถึงภาค "west" เท่านั้นที่จะถูกเก็บเพื่อส่งออก ในการตัดสินใจว่าจะรับบันทึกข้อความหรือไม่ เราจะใช้โค้ดบล็อค try/except และ else ร่วมกับ custom exception InvalidLocation ในการใช้ custom exception ให้ตรวจสอบใน try ว่าบันทึกข้อความมีป้าย "west" และหากไม่ใช่ให้เรียกใช้ exception ส่วน except จะยืนยันว่าบันทึกข้อความไม่ถูกต้อง และใน else จะรวบรวมและเพิ่มบันทึกข้อความไปยังรายการ prep หากมันถูกกำหนดให้ส่งถึงภาค "west" ตัวอย่างเช่น:
try: if red_memo != "west": raise InvalidLocation except InvalidLocation: player.speak("This is not an order that needs to be sent out") else: player.collect(red_memo) prep.append(red_memo)
เดินไปยังแต่ละจุด X สีเข้มเหนือพรมที่มีสีต่างๆ อยู่ด้านหน้าของโต๊ะและเรียกใช้งานลำดับของ exception โดยใช้ค่าคงที่ตัวแปรที่ถูกต้องสำหรับแต่ละสี
เมื่อคุณได้รวบรวมบันทึกข้อความไปแล้ว ให้เดินไปที่จุด X สีทองด้านหน้าประตูและใช้ฟังก์ชัน open() เพื่อเข้าถึงฟาร์มก้องของนกพิราบ เมื่ออยู่ภายในแล้ว ให้เดินไปยังจุด X สีสว่าง หันกลับ ใช้ฟังก์ชัน close() เพื่อปิดประตูเพื่อให้แน่ใจว่าไม่มีนกพิราบหนีออกไป
เดินไปยังจุด X สีเข้มเหนือพรมสีม่วง บนคอก เราจะตรวจสอบว่านกพิราบมีอายุพอที่จะบินส่งข้อความหรือไม่ หรือเป็นลูกนกที่ยังไม่สามารถส่งได้ มีค่าคงที่ตัวแปรอีกสี่ตัวที่จะถูกใช้ในส่วนนี้: purple_pen, yellow_pen, white_pen และ pink_pen ซึ่งสอดคล้องกับพรมแต่ละสี เราจะใช้เทคนิคเดียวกับบันทึกข้อความ โดยใช้งานคลาสตัวที่สองที่ได้ตั้งค่าไว้
ใช้โค้ดบล็อค try/except และ else ร่วมกับ custom exception UnsuitableSelection เพื่อตรวจสอบว่านกพิราบมีอายุพอที่จะส่งข้อความหรือไม่ ในบล็อค try จะตรวจสอบว่าค่าคงที่ตัวแปรที่แทนคอกมีนกพิราบที่เหมาะสมโดยการเช็คว่านกมีอายุน้อยกว่าสอง (2) ปีหรือไม่ หากนกพิราบไม่เหมาะสม บล็อค except จะถูกเรียกใช้งาน มิฉะนั้น บล็อค else จะถูกกระตุ้นเพื่อให้คุณเพิ่มนกพิราบลงในรายการ prep เพื่อส่งข้อความ
try: if purple_pen <= 2: raise UnsuitableSelection except UnsuitableSelection: player.speak("Pigeon unsuitable to deliver") else: prep.append(purple_pen) player.speak("Pigeon Collected")
ไปยังแต่ละจุด X สีเข้มเหนือพรมที่มีสีต่างๆ และใช้ลำดับนี้โดยใช้ค่าคงที่ตัวแปรที่ถูกต้องตรงกับพรมสีที่ถูกต้อง เมื่อคุณได้รวบรวมนกพิราบและข้อความแล้ว ให้เดินไปที่จุด X สีทองที่ด้านล่างสุดและใช้ฟังก์ชัน place() กับรายการ prep ที่คุณได้สร้างขึ้นเพื่อส่งนกพิราบส่งข้อความและทำภารกิจให้เสร็จสิ้น