我们先来解释一下什么是异常——异常表示程序运行的时候发生了错误,异常的产生会影响程序的正常执行。为了避免程序终止,当Python脚本发生异常时我们需要对其进行处理,让程序得以继续运行。我们称这一步骤为异常处理。
Python中的异常处理语法使用`try-except`块来捕获和处理异常。`try`代码块是用来包裹可能会出现异常的代码,而`except`代码块则是用来处理捕获到的异常。我们可以预先假设出现错误的类型,用except+异常类型名称表示,当出现了相应的异常后就会输出except下辖的代码,异常类型可以不止有一种。
try:
a = int(input('输入一个数字用作分子:'))
b = int(input('输入一个数字用作分母:'))
c = a / b
print(c)
except ValueError:
print('数据类型错误')
except ZeroDivisionError:
print('分母不能为零')
如代码所示,我们构建了一个简易的除法运算器,现在我们猜想可能会出现输入元素不为数字的情况,也可能会出现分母为零的情况,那么我就会去查询这两种情况对应的异常名称python标准异常
之后我们用`try-except`形式将正常情况和异常情况都包含在内,作为测试用例,这里一共展示了三种输入情况。有同学可能会问如果两种错误情况同时发生怎么办,在本案例中,当分子为非数字且分母为零时,会在变量a赋值完成后就弹出数据类型错误,并终止程序。
正常情况
输入一个数字用作分子:6
输入一个数字用作分母:3
2.0
异常情况一
输入一个数字用作分子:2
输入一个数字用作分母:c
数据类型错误
异常情况二
输入一个数字用作分子:3
输入一个数字用作分母:0
分母不能为零
另外我们可以用关键字`as`用于将捕获到的异常赋值给变量`e`。然后可以在`except`块中使用这个变量来访问异常的详细信息。
try:
a = int(input('输入一个数字用作分子:'))
b = int(input('输入一个数字用作分母:'))
c = a / b
print(c)
except ValueError as v:
print('数据类型错误', v)
except ZeroDivisionError as z:
print('分母不能为零', z)
输入一个数字用作分子:c
数据类型错误 invalid literal for int() with base 10: 'c'
如果我们不能确定异常类型,或者没有必要区别每种异常类型,那就可以只使用except来概括所有异常。
try:
a = int(input('输入一个数字用作分子:'))
b = int(input('输入一个数字用作分母:'))
c = a / b
print(c)
except:
print('程序发生错误')
输入一个数字用作分子:2
输入一个数字用作分母:0
程序发生错误
输入一个数字用作分子:b
程序发生错误
except还可以用在最后,只选择几种有意义的异常类型用except+异常类型名称表示出来,其他的异常统一输出except后的代码块。
另外,还可以使用`finally`块来执行一些无论是否发生异常都需要执行的代码。`finally`块中的代码总是会在`try`块中的代码执行完毕后执行,无论是否发生了异常。
try:
a = int(input('输入一个数字用作分子:'))
b = int(input('输入一个数字用作分母:'))
c = a / b
print(c)
except ZeroDivisionError:
print('分母不能为零')
except:
print('出现零分母以外的错误')
finally:
print("构建了除法运算器")
输入一个数字用作分子:5
输入一个数字用作分母:0
分母不能为零
构建了除法运算器
输入一个数字用作分子:1
输入一个数字用作分母:2
0.5
构建了除法运算器
输入一个数字用作分子:5
输入一个数字用作分母:a
出现零分母以外的错误
构建了除法运算器
我们除了被动响应异常外,还可以主动检测异常,通过使用‘raise’语句来抛出一个指定的异常。
a = int(input('输入一个数字用作分子:'))
b = int(input('输入一个数字用作分母:'))
c = a / b
print(c)
if a == 0 :
raise Exception('无需计算,分子为零的结果均为0')
输入一个数字用作分子:0
输入一个数字用作分母:5
0.0
Traceback (most recent call last):
File "D:\cgwx.py", line 6, in
raise Exception('无需计算,分子为零的结果均为0')
Exception: 无需计算,分子为零的结果均为0
最后我们再来阐明一下异常处理的概念,这里的异常更多指的是‘error’而非‘warning’,以下是两者的区别。
"warn" 表示一个警告,表示可能会导致错误或问题,但程序仍然可以继续执行。警告通常用于提示程序员潜在的问题或不推荐的用法。当出现警告时,程序会继续执行,但警告的存在可能会导致程序出现预期之外的行为。
"error" 表示一个错误,表示程序无法继续执行或执行结果不符合预期。错误通常是由于严重的逻辑或语法问题引起的,需要修复才能使程序正常运行。当出现错误时,程序会终止执行并通常会报告给用户。
通俗来讲,我们在使用pycharm编译的时候可能会出现画白色波浪线的警告,这可能是字母之间空格的问题,也可能是定义了某个变量却没有使用它,但这些问题都不妨碍我们程序的正常运行,它们被称为“warning”;而像运算时输入字母这类导致程序无法运行的问题,我们称为“error”,这也是我们今天异常处理的对象。希望大家在使用时不要混淆,谢谢观看。