หลักสูตรการพัฒนาด้วย 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 แต่ละจุดและหันไปทางเครื่องทำน้ำอุ่น ให้ดำเนินการลำดับคำสั่งโดยใช้ค่าคงที่ตัวแปรที่ตรงกับพรมสีที่ถูกต้องเพื่อให้ผ่านด่านนี้