1. 异常和错误的概念
在使用Python进行程序开发时,避免不了会遇到一些错误和异常,下面来了解一下这两个概念的区别。
错误是程序在编译或运行时的语法错误或逻辑错误,无法通过检查或测试发现,会使程序直接停止执行。
#示例一:语法错误
print('Hello, World!')
print 'We love Python!'
上面的代码中,第二行语句在Python3中应该使用括号,因此在运行时会报出语法错误信息:
File "test.py", line 2
print 'We love Python!'
^
SyntaxError: invalid syntax
异常是指程序在运行时的不正常状态,比如尝试除以0、引用不存在的对象、文件无法打开等。异常可以被预见和处理。
#示例二:除数为0的异常
a = 10
b = 0
print(a/b)
上面的代码中,第三行语句会尝试计算10除以0,这时会抛出异常:
Traceback (most recent call last):
File "test.py", line 3, in
print(a/b)
ZeroDivisionError: division by zero
2. 常见异常类型
2.1 NameError
NameError是指在Python中未定义的变量或函数名。
#示例三:名称错误
a = 10
print(a + b)
上面的代码中,变量b没有定义,因此会抛出NameError异常:
Traceback (most recent call last):
File "test.py", line 2, in
print(a + b)
NameError: name 'b' is not defined
2.2 TypeError
TypeError是指尝试把一个数据类型用于不合适的操作时引发的异常,比如把字符串和数字相加、把列表和字典相加等。
#示例四:类型错误
a = 'hello '
b = 10
print(a + b)
上面的代码中,第三行语句尝试将字符串和数字相加,这时会抛出TypeError异常:
Traceback (most recent call last):
File "test.py", line 3, in
print(a + b)
TypeError: can only concatenate str (not "int") to str
2.3 IndexError
IndexError是指访问一个不存在的索引时引发的异常,比如访问列表中一个不存在的元素。
#示例五:索引错误
a = [1, 2, 3]
print(a[3])
上面的代码中,第二行语句尝试访问第4个元素,而列表中只有3个元素,因此会抛出IndexError异常:
Traceback (most recent call last):
File "test.py", line 2, in
print(a[3])
IndexError: list index out of range
2.4 KeyError
KeyError是指在字典中查找一个不存在的键时引发的异常。
#示例六:键错误
a = {'a': 1, 'b': 2, 'c': 3}
print(a['d'])
上面的代码中,第二行语句尝试查找键'd'的值,而字典中没有这个键,因此会抛出KeyError异常:
Traceback (most recent call last):
File "test.py", line 2, in
print(a['d'])
KeyError: 'd'
3. 异常处理
在Python中可以使用try...except语句来处理在程序运行时可能发生的异常。
try:
n = int(input('请输入一个整数:'))
print(100 / n)
except ValueError:
print('输入错误,需要输入整数')
except ZeroDivisionError:
print('除数不能为0')
上面的代码中,try语句块尝试获取用户输入并计算结果,如果出现ValueError或ZeroDivisionError异常,则在except语句中处理。
一般情况下,不建议使用通配符异常处理,而应通过具体的异常类型来判断和处理:
try:
#执行代码块
except Exception as e:
#处理异常
因为使用通配符异常处理不利于发现和解决问题,可以使用Python提供的多个异常类型来分别进行处理。
4. 自定义异常类
除了使用Python提供的异常类型,还可以自定义异常类来进行异常处理。
class MyException(Exception):
pass
try:
raise MyException('这是我的自定义异常')
except MyException as e:
print(e)
上面的代码中,定义了一个名为MyException的异常类,然后使用raise语句抛出异常,最后在except语句中进行异常处理。
5. 总结
Python中的错误和异常是程序开发过程中不可避免的问题,了解常见的异常类型并正确处理异常是保证程序质量的重要保障。