หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ

การจัดการข้อยกเว้น
การปรับแต่งคลาสข้อยกเว้น

วัตถุประสงค์

ตรวจสอบน้ำฝนที่เก็บรวบรวมและตรวจสอบให้แน่ใจว่ามันถูกประมวลผลและส่งต่ออย่างถูกต้องโดยการปรับแต่งคลาสข้อยกเว้น

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

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

class PressureError(Exception): def __init__(self, pressure, message="Water pressure is offset, pressure is: ", error_code=404): self.pressure = pressure self.message = message self.error_code = error_code super().__init__(self.message) async def eval(self): await player.display("[Error: %s {%s %s}]" % (self.error_code , self.message, self.pressure)) if self.pressure < 100: return ("Valve has been closed") if self.pressure > 360: return ("Valve has been opened")

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

class TemperatureError(Exception): def __init__(self, temp, message="Temperature is not appropiate, enter new temperature: ", error_code=808): self.temp = temp self.message = message self.error_code = error_code super().__init__(self.message) async def eval(self): await player.display("[Error: %s {%s %s}]" % (self.error_code , self.message, self.temp)) return ("Temperature Corrected")

เริ่มต้นด้วยการเดินไปที่เครื่องหมาย X สีอ่อนบนพรมสีเขียวแล้วหันไปทางถังที่มีวาล์ว มีวาล์วจำนวนสี่ (4) ตัวที่ควบคุมแรงดันของน้ำที่ถูกสูบจากถังเก็บ มีค่าคงที่ตัวแปรสี่ตัว ได้แก่ green_pressure , red_pressure , blue_pressure และ orange_pressure ซึ่งเก็บค่าแรงดันของถังในพรมสีที่ตรงกัน

บนเครื่องหมาย X สีอ่อนทุกจุด ให้ใช้โครงสร้างบล็อคคำสั่ง try/except และ else เพื่อตรวจสอบว่าแรงดันในแต่ละถังเหมาะสมหรือไม่ หากแรงดันต่ำกว่า 100 หรือสูงกว่า 300 ให้เรียกข้อยกเว้น PressureError ที่กำหนดเองพร้อมกับส่งค่าแรงดันเป็นอาร์กิวเมนต์ หากถูกเรียกใช้งานจะมีการแสดงรหัสข้อผิดพลาดและแก้ไขปัญหา มิฉะนั้นส่วน else จะถูกเรียกยืนยันว่าแรงดันในถังนั้นเหมาะสม ตัวอย่างเช่น:

try: if green_pressure < 100 or green_pressure > 360: raise PressureError(green_pressure) except PressureError as x: error = await x.eval() player.speak(error) else: player.speak( "Pressure is appropriate" )

ทำเช่นนี้บนเครื่องหมาย X สีอ่อนทั้งหมด โดยใช้ค่าคงที่ตัวแปรที่ตรงกับพรมสีต่าง ๆ และตรวจสอบหรือปรับวาล์วแรงดันตามความจำเป็น

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

เมื่อคุณได้ข้อมูลอุณหภูมิสำหรับแต่ละเครื่องแล้ว ให้เดินไปที่เครื่องหมาย X สีเข้มบนพรมสีม่วง ที่นี่เราจะใช้ลำดับคำสั่ง try/except และ else เพื่อตรวจสอบว่าเครื่องทำน้ำอุ่นมีอุณหภูมิถูกต้องหรือไม่ มีค่าคงที่ตัวแปรอีกสี่ตัวที่เกี่ยวข้องกับพรมสี ได้แก่ purple_temperature , yellow_temperature , pink_temperature และ white_temperature

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

try: if purple_temperature < 100: raise TemperatureError(120) except TemperatureError as x: error = await x.eval() player.speak(error) else: player.speak( "Temperature is ok" )

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

หนังสือโค้ด