8. 错误和异常
8.1 语法错误
语法错误也就是解析错误.
Test.py:
while True
print("ss")
运行结果:
File "main.py", line 1
while True
^
SyntaxError: invalid syntax
***Repl Closed***
8.2 异常
当语法没有错误后还会引发其他的错误, 例如除数是0的时候, 会抛出ZeroDivisionError错误, 当然还有很多别的错误.
Test.py:
x = 10 / 0
运行结果:
Traceback (most recent call last):
File "main.py", line 1, in <module>
x = 10 / 0
ZeroDivisionError: division by zero
***Repl Closed***
8.3 处理异常
使用try except
语句来处理捕获异常.
Test.py:
try:
x = 10 / 0
except ZeroDivisionError:
print("除数不能是0")
运行结果:
除数不能是0
***Repl Closed***
try except
语句的执行逻辑.
首先先执行try其中的逻辑, 如果其中没有错误则跳过except的部分;
如果try部分出现错误, 则不执行try的后续部分, 直接跳到except部分执行逻辑.
except 可以包括多个异常类型.
Test.py:
try:
x = 10 / 0
except (ZeroDivisionError, RuntimeError):
print("除数不能是0")
运行结果:
除数不能是0
***Repl Closed***
try except
语句可以有多个except
子句, 根据except
先后顺序优先匹配第一个获取到的异常.
Test.py:
try:
x = 10 / 0
except Exception:
print("Exception")
except ZeroDivisionError:
print("除数不能是0")
运行结果:
Exception
***Repl Closed***
try except
语句还有一个else
语句, 但是其必须放在所有的except后面, 其只会在不发生异常的时候执行.
Test.py:
try:
print("正常执行")
except Exception:
print("发生错误了")
else:
print("没有发生异常")
运行结果:
正常执行
没有发生异常
except 可以在异常的后面指定一个变量, 它的参数有二个, 存储于异常的args中, 可以通过变量的args逐个获取, 也可以使用__str__()
或直接输出来获取.
Test.py:
try:
raise Exception("a", "b")
except Exception as e:
print("arg1:{0}, arg2:{1}".format(*e.args))
print(e.__str__())
print(e)
运行结果:
arg1:a, arg2:b
('a', 'b')
('a', 'b')
8.4 抛出异常
使用raise
语句可以手动抛出指定的异常.
Test.py:
try:
raise Exception("a", "b")
except Exception as e:
print(e)
运行结果:
('a', 'b')
raise
可以抛出异常的实例(如上)或异常类(派生自Exception的异常类). 如果是异常类, 其将调用没有参数的构造函数来隐式实例化.
Test.py:
try:
raise ValueError
except ValueError as e:
print("cause by ValueError")
运行结果:
cause by ValueError
可以在except中捕获异常但是并不处理它, 使用raise可以在次将其抛出去.
Test.py:
try:
raise ValueError
except ValueError as e:
print("cause by ValueError")
raise
运行结果:
cause by ValueError
Traceback (most recent call last):
File "/Users/chenxiaowei/Desktop/VsCode-PythonWorkSpace/test.py", line 2, in <module>
raise ValueError
ValueError
8.5 用户自定义异常
python的异常类型有很多, 但是有时候我们还是需要定义自己的异常类型, 方便于处理异常的信息等.
Test.py:
class Error(Exception):
pass
class MyError(Error):
def __init__(self, expression, message):
self.expression = expression
self.message = message
try:
raise MyError("MyErrror", "error")
except MyError as e:
print(e)
运行结果:
('MyErrror', 'error')
8.6 定义清理操作
try except
语句之前有一个else
的可选项, 用于当没有发生异常的时候执行, 现在还有一个可选项, finally
语句, 其作用为——无论如何最后执行它(即使break, continue, return), 一般finally
语句用于释放外部资源.
Test.py:
try:
raise Exception("a", "b")
except Exception as e:
print("Error happend")
else:
print("No Error happend I will Do")
finally:
print("I Will Do!")
运行结果:
Error happend
I Will Do!
8.7 预定义的清除操作
像之前使用的with语句用于打开文件, 其定义了当不需要使用的时候执行标准的清理草组, 无论改对象是执行成功或者失败.