异常处理
re 模块
-
findall
-
search
-
match
ret =re.math("\d+","324ajfldksj")
- `print (ret.goup())
- 重头开始匹配,相当于
ret = re.search("^\d+","324ajfldksj")
print(ret.goup())
-
(?:正则表达式) 表示取消优先显示功能
-
`(?P<组名>正则表达式)
异常处理
-
异常
- 在编译阶段没问题,在执行阶段才报错
-
语法错误
- 在程序执行前就规避掉,不应该留到程序中来处理
- 在编译阶段出现的报错,飘红
- 在程序执行前就规避掉,不应该留到程序中来处理
-
异常出现之后,程序就不继续执行了
-
如何查看异常?
-
基本语法:
-
try:
- 被检查的代码块
-
execpt 异常类型:
-
try中一旦检测到异常,就会执行execpt下的代码块
-
try: f = open("a.txt") g = (line.strip() for line in f) print(next(g)) print(next(g)) print(next(g)) print(next(g)) except StopIteration: f.close() #当print(next(g)读完后,下一句print(next(g))就会报错, # 然后触发except语句,执行f.close() l = ['登陆','注册'] try: num = int(input('num : ')) print(l[num - 1]) except (ValueError,IndexError): #可以将错误类型写在一起 print('输入了错误的内容')
-
-
-
多分支
-
l = ['登陆','注册'] try: num = int(input('num : ')) print(l[num - 1]) except ValueError: print('输入了错误的内容') except IndexError: print('您输入的内容不在范围内') #利用多分支,执行不同错误后的不同语句
-
-
万能异常 (慎用)尽量不要直接用来处理错误
try: int("sfh") except Exception: print("异常啦") #异常啦 即遇到错误就执行万能异常
- 可以放在多分支最后,当遇到未知错误时,执行Exception后的代码块。
l = ['登陆','注册'] try: num = int(input('num : ')) print(l[num - 1]) except (ValueError,IndexError): print('输入了错误的内容') except Exception as e: print(e)
-
异常处理中的其他机制
-
else 与for else语句类型相似,for语句中不能被打断,否则不会执行else语句
-
try: pass #发邮件的逻辑 except 错误类型: print("执行某个处理") else: pass #汇报这段代码执行完了:才能执行else语句
-
-
finallly 无论如何都要执行,
-
应用场景:收尾工作,打开一个文件,占用一个网络资源,打开了一个文件,执行完后或者出现错误,都需要进行关闭文件,这时候finally就完美做到这点
-
# try: # f = open('content') # name #遇见错误 # finally: # f.close() #无论如何都会执行 # print('closed')
-
-
raise 主动触发异常
-
try: raise TypeError("类型错误") except Exception as e: print(e)
自定义异常
class EvaException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: raise EvaException('类型错误') except EvaException as e: print(e)
-
断言
-
assert 1 == 1 #满足条件才执行 print('*'*100) assert 1 == 2 print('*'*100)
-
常见 错误类型
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的