Python 异常
Python 异常
错误:语法不符合Python规则,出现解析错误
异常:语法无误,运行时引发错误。
常见的异常类型
| 异常 | 示例 |
|---|---|
| NameError | a * 3 |
| IndexError | a = [1,2,3] a[3] = 100 |
| TypeError | '2' + 2 |
| ValueError | int("a.123") |
| ZeroDivisionError | 1 / 0 |
异常执行的逻辑
- 试图执行的语句块。如果没有异常发生,则跳过except子句
- 如果有异常发生,则跳过try子句剩余部分,根据异常类型去匹配except后面的异常。
- 匹配成功执行except子句的的语句块。
- 如果异常类型与所有except类型不匹配,则该异常会传递给更外层的try-except语句。
- 如果异常无法被任何except子句处理,则程序抛出异常并停止运行。
# 示例
class ScoreError(Exception):
pass
try:
if score > 100 or score < 0: # 正常的程序逻辑,可能会抛出异常
raise ScoreError("成绩应该在0~100之间")
print("成绩为{score}")
except ScoreError as e: # e为当前发生异常的示例对象
print(repr(e)) # 异常类型+异常详细信息
print(str(e))
print(e)
except (TypeError,NameError): # except后面异常类型可以是多个异常类型的元组
pass
except: # except也可以是空,表示捕获所有异常
pass
else: # 如果try子句执行没有发生异常事执行else;发生异常则略过else
pass
finally:
pass # 无论try子句是否发生异常,finally子句都会执行。
自定义异常
-
如何自定义异常
- 异常以类的形式创建,从Exception类派生。
- 自定义类通常很简单,类体可以省略,默认从父类继承;最重要的名称,用以表明发生了什么状况。
- 命名规范:以Error结尾,与内置异常名保持一致
-
自定义异常可以用于跳出多重循环
-
python没有直接从多重循环里直接跳出的手段
-
break只能跳出它所在的循环,并不能退出整个循环。
class GetOutOfMultiLoop(Exception): pass try: for cock in range(1,20): for hen in range(1,33): chick=100-cock-hen if chick % 3 == 0 and 5 * cock + 3 * hen + chick // 3 ==100: raise GetOutOfMultiLoop except GetOutOfMultiLoop: print("cock=",cock,"hen=",hen,"chick=",chick)
-
except子句
注意:不要捕获全部异常,这种方式很容易掩盖真正的编程错误!
原则:大多数情况下,仅明确捕获自己能够判断的异常,并进行针对性的处理。
else子句
实际应用中放在else子句中的处理,通常是为了避免它们会抛出异常,从而干扰到try except所保护的代码的运行。
finally
实际应用中,finally子句用于释放外部资源(例如文件或网络连接),保证是否成功使用资源都在最后将其关闭。

浙公网安备 33010602011771号