หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
การจัดการข้อยกเว้น
ปรับแต่งคลาส Exception
วัตถุประสงค์
ตรวจสอบน้ำฝนที่เก็บรวบรวมและตรวจสอบว่ามีการประมวลผลและถ่ายโอนอย่างถูกต้องโดยปรับแต่งคลาสข้อยกเว้น
ที่ปลายสุดของเขตหลังคา มีถังเก็บน้ำฝนที่เก็บรวบรวมไว้ น้ำนี้ถูกกรองและถ่ายโอนไปทั่วอาคารเพื่อวัตถุประสงค์ต่าง ๆ บางวาล์วบนผนังด้านบนควบคุมแรงดันของน้ำที่ไหล ในขณะที่ห้องเก็บของสุดท้ายมีเครื่องทำน้ำอุ่นหลายตัว การทำงานของเครื่องจักรอาจซับซ้อน แต่สามารถทำให้ดำเนินการได้อย่างมีประสิทธิภาพโดยการระบุรหัสข้อผิดพลาดและการตั้งค่ามาตรการแก้ไขที่มีประสิทธิภาพ ซึ่งทำได้โดยปรับแต่งคลาสข้อยกเว้นที่คุณสร้างขึ้นสำหรับข้อยกเว้นที่กำหนดเองของคุณ
มีคลาสข้อยกเว้นที่กำหนดเองสองตัวถูกตั้งค่าไว้ในตัวแก้ไขโค้ด ความสามารถของคุณในการใช้งานพวกมันจะเป็นสิ่งสำคัญในการแก้ไขปัญหาเครื่องจักรที่คุณพบ ตัวแรกเป็นข้อยกเว้นเพื่อแก้ไขปัญหาแรงดันน้ำ ซึ่งมีไว้เพื่อใช้งานร่วมกับวาล์วเพื่อให้แน่ใจว่าน้ำไหลอย่างถูกต้องเข้าสู่คอมเพล็กซ์หรือหากแรงดันต้องการการปรับเปลี่ยน ขึ้นอยู่กับว่าหากแรงดันต่ำกว่า 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 __str__(self):
await player.write("[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 __str__(self):
await player.write("[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: player.speak(x) 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: player.speak(x) else: player.speak( "Temperature is ok" )
ทำเช่นนี้สำหรับเครื่องทำน้ำอุ่นทั้งหมด บนเครื่องหมาย X แต่ละจุดขณะหันหน้าไปยังเครื่องทำน้ำอุ่น ให้ดำเนินชุดคำสั่งโดยใช้คอนสแตนต์ตัวแปรที่ตรงกับพรมสีที่ถูกต้องเพื่อทำให้ระดับนี้เสร็จสมบูรณ์