语法错误和异常
语法错误:SyntaxError: invalid syntax
缺少标点符号等
异常:
即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现
BaseException:所有异常的基类
ZeroDivisionError:除数为0
NameError:未声明/初始化
TypeError
SystemExit
KeyboardInterrupt
GeneratorExit
Exception
…
异常处理
try 语句可为一组语句指定异常处理器和/或清理代码:
使用try…except捕获错误有一个巨大的好处,就是可以跨越多层调用比如函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理
try:
代码块
except 错误类型 as e:
子句 #把错误赋值给e
except 错误类型 :
子句
...
else:
子句 #放在所有except语句后(可没有),子句将在try子句没有发生任何异常的时候执行
finally:
print('finally...') #finally如果有,则一定会被执行(可以没有finally语句)。
try语句按照如下方式工作;
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的try子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:
except (RuntimeError, TypeError, NameError): pass
else:使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常。
Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”。比如:
try:
foo()
except ValueError as e:
print('ValueError')
except UnicodeError as e:
print('UnicodeError')
第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了。
Python所有的错误都是从BaseException类派生的
抛出异常:
Python 使用 raise 语句抛出一个指定的异常。例如:
>>>raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere
raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
>>>try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
用户自定义异常:创建一个新的异常类 class MyError(Exception):
定义清理行为:finally子句
预定义的清理行为
本文深入探讨Python中的异常处理机制,包括语法错误、运行时异常、异常类型如ZeroDivisionError和NameError,以及如何使用try...except语句进行错误捕获和处理。此外,还介绍了自定义异常和finally子句的使用。
161

被折叠的 条评论
为什么被折叠?



