[Python] (Day-16) - 错误和异常
2017-10-20 本文已影响33人
已重置2020
Knowledge is a treasure but practice is the key to it.
学识是宝藏,但实践才是打开它的钥匙。
语法错误
- 语法错误或者称之为解析错
- 语法错误在编译时编译失败
示例:
a = abc # 字符串不加引号
x = 4 + y # 使用了未定义的变量
print("%f"6.66) # 打印时不加`%`号
.
.
.
异常
运行期检测到的错误被称为异常
异常处理
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,称之为异常处理
基本格式:
try:
pass
except Exception as err:
pass
示例:
while True:
try:
x = int(input("Please enter a number: "))
print(x)
except ValueError as err:
print("OO! That was no valid number. Try again %s" % err)
解读:
- 1、首先,执行
try
子句(在关键字try
和关键字except
之间的语句) - 2、如果没有异常发生,忽略
except
子句,try
子句执行后结束 - 3、如果在执行
try
子句的过程中发生了异常,那么try
子句余下的部分将被忽略 - 4、如果异常的类型和
except
之后的名称相符,那么对应的except
子句将被执行 - 5、如果一个异常没有与任何的
except
匹配,那么这个异常将会抛出
特点:
- 一个
try
语句可能包含多个except
子句,分别来处理不同的特定的异常
s1 = 'hello'
try:
int(s1)
except IndexError as err:
print(err)
except KeyError as err:
print(err)
except ValueError as err:
print(err)
- 一个
except
子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组
except (RuntimeError, TypeError, NameError):
pass
常见异常
Python中的异常种类非常多,每个异常专门用于处理某一项异常
异常符 | 说明 |
---|---|
AttributeError | 试图访问一个对象没有的树形,比如foo.x ,但是foo 没有属性x
|
IOError | 输入/输出异常;基本上是无法打开文件 |
ImportError | 无法引入模块或包;基本上是路径问题或名称错误 |
IndentationError | 语法错误(的子类) ;代码没有正确对齐 |
IndexError | 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] |
KeyError | 试图访问字典里不存在的键 |
KeyboardInterrupt | Ctrl+C被按下 |
NameError | 使用一个还未被赋予对象的变量 |
SyntaxError | Python 代码非法,代码不能编译 |
TypeError | 传入对象类型与要求的不符合 |
UnboundLocalError | 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 |
ValueError | 传入一个调用者不期望的值,即使值的类型是正确的 |
异常其他结构
try:
# 主代码块
pass
except KeyError as err:
# 异常时,执行该块
pass
else:
# 主代码块执行完,执行该块
pass
finally:
# 无论异常与否,最终执行该块
pass
主动触发异常
使用
raise Exception(xxx)
主动出发异常
try:
raise Exception("我错了")
except Exception as err:
print(err)
自定义异常
继承自 Exception 类,或者直接继承,或者间接继承
定义一个异常,继承自 Exception
class XMException(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message
触发异常
try:
raise XMException('我的异常')
except XMException as err:
print(err)