Python_异常处理

时间:2025-02-10 07:05:35

1.常见异常

'''AssertionError:断言语句失败。当assert这个关键字后面的条件为False时,
程序将停止并抛出AssertionError异常。assert语句一般是在测试程序的时候用
于在代码中置入检查点'''
>>> a = ['lzm']
>>> assert len(a) > 0
>>> ()
'lzm'
>>> assert len(a) > 0
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    assert len(a) > 0
AssertionError

'''AttributeError:尝试访问未知的对象属性。当试图访问的对象属性不存在时
抛出AttributeError异常'''
>>> a = []
>>> ()
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    ()
AttributeError: 'list' object has no attribute 'lzm'

'''IndexError:索引超出序列的范围'''
>>> a = [1, 1, 1]
>>> a[3]
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    a[3]
IndexError: list index out of range

'''KeyError:字典中查找一个不存在的关键字。建议使用()方法'''
>>> a = {'a':1, 'b':2, 'c':3}
>>> a['a']
1
>>> a['d']
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    a['d']
KeyError: 'd'

'''NameError:尝试访问一个不存在的变量'''
>>> b
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    b
NameError: name 'b' is not defined

'''OSError:操作系统产生的异常。FileNotFoundError是OSError的子类'''
>>> f = open('qqqq')
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    f = open('qqqq')
FileNotFoundError: [Errno 2] No such file or directory: 'qqqq'

'''SyntaxError:Python的语法错误'''
>>> print'acs'
SyntaxError: invalid syntax

'''TypeError:不同类型间的无效操作,例如类型不同的对象是不能相互进行计算的'''
>>> 1+'1'
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    1+'1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'

'''ZeroDivisionError:除数为零'''
>>> 1 / 0
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    1 / 0
ZeroDivisionError: division by zero

异常捕获可以使用try语句实现,任何出现在try语句范围内的异常都会被即使捕获到。

-except

try:
    检测范围
except Exception[as reason]:
    出现异常(Exception)后的处理代码

# 举个栗子
f = open('并不存在.txt')
print(())
()
>>>
Traceback (most recent call last):
  File "C:\Users\威震东南亚\Desktop\PY\", line 1, in <module>
    f = open('并不存在.txt')
FileNotFoundError: [Errno 2] No such file or directory: '并不存在.txt'
# 修改后
try:
    f = open('并不存在.txt')
    print(())
    ()
except OSError:
    print('文件打开过程中出错')
>>>
文件打开过程中出错
# 使用as把错误的具体内容打印出来
try:
    f = open('并不存在.txt')
    print(())
    ()
except OSError as reason:
    print('文件出错\n具体原因是:' + str(reason))
>>>
文件出错
具体原因是:[Errno 2] No such file or directory: '并不存在.txt'

#针对不同异常设置多个except
try:
    a = 1 + '1'
    f = open('并不存在.txt')
    print(())
    ()
except OSError as reason:
    print('文件出错\n具体原因是:' + str(reason))
except TypeError as reason:
    print('类型出错\n具体原因是:' + str(reason))
>>>
类型出错
具体原因是:unsupported operand type(s) for +: 'int' and 'str'

# 对多个异常统一处理
try:
    a = 1 + '1'
    f = open('并不存在.txt')
    print(())
    ()
except (OSError, TypeError) as reason:
    print('出错了\n具体原因是:' + str(reason))
>>>
出错了
具体原因是:unsupported operand type(s) for +: 'int' and 'str'

# 捕获所有异常
try:
    a = 1 + '1'
    f = open('并不存在.txt')
    print(())
    ()
except:
    print('出错了')
>>>
出错了

'''NOTE:try语句检测范围内一旦出现异常,剩下的语句将不会被执行'''

-finally语句

try:
    f = open('') #真实存在的文件
    print(())
    a = 1+'1' #出现异常,程序直接跳转执行except语句
    ()
except:
    print('ERROR!')
>>>
cute
ERROR!
'''事实上()并没有被执行,所以为了实现这种即使出现异常
也不得不执行的收尾工作,引入finally'''

try:
    f = open('') #真实存在的文件
    print(())
    a = 1+'1'
except:
    print('ERROR!')
finally:
    ()
'''finally语句无论如何都会执行'''

语句

'''可以使用raise语句让程序自己抛出一个异常'''
>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError

'''抛出的异常还可以带参数,表示异常的解释'''
>>> raise ZeroDivisionError('除数不能为0')
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise ZeroDivisionError('除数不能为0')
ZeroDivisionError: 除数不能为0

5.丰富的else语句

'''如果try语句里没有出现任何异常,就会执行else语句'''
try:
    int('abc')
except ValueError as reason:
    print('出错:'+str(reason))
else:
    print('NO ERROR')
>>>
出错:invalid literal for int() with base 10: 'abc'

6.简洁的with语句

try:
    f = open('', 'w')
    for i in f:
        print(i)
except OSError as reason:
    print('出错:'+str(reason))
finally:
    ()

'''对文件操作使用with语句,将大大较少代码量,而且再也不用担心出现
文件打开了忘记关闭的问题,with会自动帮助关闭文件'''
try:
    with open('', 'w') as f:
        for i in f:
            print(i)
except OSError as reason:
    print('出错:'+str(reason))