8. 错误和异常

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语句用于打开文件, 其定义了当不需要使用的时候执行标准的清理草组, 无论改对象是执行成功或者失败.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值