Python是一种优秀的编程语言,它提供了丰富的异常处理功能,允许程序在运行时检测并处理各种不同类型的错误。但是,要是已有的异常类型无法满足你的需求,你就需要使用自定义异常并进行相应的异常捕捉。
自定义异常
自定义异常允许程序员创建新的异常类型来处理程序中独特的错误条件。自定义异常必须从内置的异常类(Exception)派生,这样它们就继承了处理错误的基本功能。自定义异常主要有两种创建方式:继承Exception或者直接定义类。
继承Exception
我们可以通过自定义一个新的异常类,从 Exception 类中继承基本的异常处理功能。以下是一个示例:
class MyException(Exception):
'''自定义异常类'''
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
在这个示例中,我们定义一个MyException异常类,它继承了Exception类,并在__init__()构造函数中定义了一个value属性,用于存储异常信息。同时,我们还覆盖了__str__()方法,使得当异常发生时,能够打印出value的值。
直接定义类
我们还可以直接定义一个新的异常类,不继承任何已有的类。以下是一个示例:
class MyException:
'''自定义异常类'''
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
在该示例中,我们定义了一个名为 MyException 的异常类,它没有继承任何内置的异常类。但是,由于我们定义了__str__()方法,仍然可以使用print打印异常的信息。
异常捕捉
在程序运行时,可能会发生各种不同类型的异常。为了避免程序崩溃,我们需要对异常进行相应的捕捉和处理。Python提供了 try…except…finally…的语句块用于处理异常。在try语句块中,我们编写可能会引发异常的代码,然后在except语句块中定义如何处理这些异常。最后,我们可以使用finally语句块来释放资源或执行一些必要的清理操作。
语法:
try:
# 可能会引发异常的代码
except ExceptionType1:
# 处理 ExceptionType1 类型的异常
except ExceptionType2:
# 处理 ExceptionType2 类型的异常
else:
# 如果没有引发异常,会执行这个块
finally:
# 最后一定会执行这个块
调用自定义异常和内置异常的方式是一样的,只需直接在except后面加上自定义异常或内置异常的名称即可。
接下来分别使用内置的异常和自定义的异常进行异常捕捉演示。
示例1:内置异常的捕获
try:
x = int(input("Please enter a number: "))
y = 1 / x
except ZeroDivisionError:
print("You cannot divide by zero!")
except ValueError:
print("You must enter an integer!")
else:
print("The result is", y)
finally:
print("Thank you for your participation!")
在这个示例中,我们使用try语句块编写了一个除法计算器。如果除数是零,程序会引发ZeroDivisionError异常。此时,程序会跳转到except语句块中,执行打印语句并提醒用户修改输入。如果输入不是整数,程序会引发ValueError异常,并跳转到相应的except块中执行打印语句。如果程序正常运行,则会跳转到else语句块中打印输出值。最后,不论程序正常还是异常退出,都会执行finally语句块。
示例2:自定义异常的捕获
try:
raise MyException('This is a custom exception.')
except MyException as e:
print(e.value)
在这个示例中,我们使用 raise 语句手动触发自定义异常 MyException。此时,程序会跳转到 except MyException 语句块中并执行相应的打印语句。注意,自定义异常被赋值给变量 e,我们可以通过 e.value 打印出异常信息。
至此,Python自定义异常和异常捕捉的方法攻略完整结束。通过自定义异常和异常捕捉,我们能够更好地管理程序错误,提高程序的稳定性和可靠性。