错误分类:
1, 语法错误: 你程序未执行之前,pycharm已经给你做了提示了,
name
if 1 > 0;
pass
age == 3
2,逻辑错误:
num = int(input('>>>'))
可预知,不可预知的,
num = int(input('>>>')) #ValueError
name # NameError
if 1 > 0; # SyntaxError
dic = {}
dic['key'] # KeyError
li = [1,2,3]
li[10] # IndexError
import ac # ImportError
View Code
什么是异常??
由错误引发的,而且出现异常就会终止程序.
为什么要进行异常处理:
1, 异常就会终止程序,用户体验极差,
2, 让你的代码不冗余.
# 触发IndexError
l=['egon','aa']
l[3]
# 触发KeyError
dic={'name':'egon'}
dic['age']
#触发ValueError
s='hello'
int(s)
错误举例
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
常用异常
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
更多异常
num1=input('>>: ') #输入一个字符串试试
if num1.isdigit():
int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
print('输入的是空格,就执行我这里的逻辑')
elif len(num1) == 0:
print('输入的是空,就执行我这里的逻辑')
else:
print('其他情情况,执行我这里的逻辑')
'''
问题一:
使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂
问题二:
这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
使用if判断异常
异常处理:
1,if ,异常处理 他只能处理简单的逻辑.
num = input('>>>')
if num.isdigit():
num = int(num)
if 1<= num <= 5:
if
else:
print('有非数字类型....')
View Code
总结:
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
2,try.异常处理
遇到报错信息,防止程序终止,执行另一个语句.
2.1 单独一个条件.单支.
try:
num = int(input('>>>')) #ValueError
name # NameError
# if 1 > 0; # SyntaxError
dic = {}
dic['key'] # KeyError
li = [1,2,3]
li[10] # IndexError
import ac # ImportError
except NameError:
print('出现了NameError错误')
print(111)
print(222)
print(333)
print(114441)
View Code
try:
num = int(input('>>>')) #ValueError
name # NameError
dic = {}
dic['key'] # KeyError
li = [1,2,3]
li[10] # IndexError
import ac # ImportError
except NameError:
print('出现了NameError错误')
except ValueError:
print('出现了ValueError错误')
except KeyError:
print('出现了KeyError错误')
print(222)
print(333)
print(114441)
class A:
def __str__(self):
return 'list index out of range'
a1 = A()
print(a1)
View Code
try:
num = int(input('>>>')) #ValueError
name # NameError
dic = {}
dic['key'] # KeyError
li = [1,2,3]
li[10] # IndexError
import ac # ImportError
except Exception as e:
print('您输入的不规范,请重新输入...')
print('稍等片刻,去去就来...')
View Code
异常处理的两种结局方式:
1,只是显示错误信息,不终止程序就行. 万能的
2,针对不同的错误,提示不同的信息,进行不同的操作. 多分支
def login():
pass
def regsiter():
pass
def article():
pass
def dariy():
pass
dic = {
1:login,
2:regsiter,
3:article,
4:dariy,
}
while True:
choice = input('请输入:')
if choice.isdigit():
choice = int(choice)
if 1 <= choice <=4:
dic[choice]()
else:
print('请范围内的数字...')
else:
print('请输入数字...')
while True:
try:
choice = int(input('请输入:'))
dic[choice]()
except ValueError:
print('请输入数字...')
except KeyError:
print('请范围内的数字...')
View Code
while True:
try:
choice = int(input('请输入:'))
dic[choice]()
except ValueError:
print('请输入数字...')
except Exception as e:
print(e)
except KeyError:
print('请范围内的数字...')
try:
choice = int(input('请输入:'))
except ValueError:
print('请输入数字...')
except KeyError:
print('请范围内的数字...')
except Exception as e:
print(e)
View Code
2.5 try except except ... else
如果程序出现异常执行except,就不会执行else,反之则执行else
try:
print('我的卡扣除100元')
print('旭哥的卡增加了100元')
except NameError:
print('转账出现异常...')
else:
print('转账成功')
View Code
2.6 try except except ... else .finally
try finally
try:
print('我的卡扣除100元')
name
print('旭哥的卡增加了100元')
except NameError:
print('转账出现异常...')
else:
print('转账成功')
finally:
print('6666666')
666不执行
name
print(666)
try:
name
finally:
print(666)
try:
f = open('t1',encoding='utf-8')
print(f.read())
'''多个文件句柄的操作'''
f.write()
finally:
f.close()
print(666)
最后close()
f.close()
def func():
try:
return 555
finally:
'''代码块'''
print(777)
func()
try finally 关闭文件句柄,关闭数据库的链接,关闭网络链接等等
/
View Code
raise TypeError('类型错误')
class Payment:
def pay(self,money):
raise TypeError('你的类中应该用一个pay方法')
class QQ(Payment):
def pay(self,money):
print('您用qq支付了%s元' % money)
class Wechat(Payment):
def pay(self,money):
print('您用微信支付了%s元' % money)
def pay(obj,money):
obj.pay(money) # a1.pay(200)
q1 = QQ()
w1 = Wechat()
pay(w1,1000)
View Code
2.8 自定义异常 (大项目,针对于python不具备的一些错误类型.)
raise TypeError('类型错误')
name1 : python解释器没法解决的错误: 周星星
class 周星星(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
raise EvaException('EvaException:错误!!!!' )
raise TypeError('EvaException:错误!!!!' )
try:
raise 周星星('EvaException:错误!!!!' )
except 周星星 as e: # e = EvaException('类型错误')
print(e)
View Code
condition = 1 > 2
assert condition # 如果条件不满足强行终止.
print(111)
print(222)
print(113331)
print(5455)
if 1 == 2:
print(111)
print(222)
print(113331)
print(5455)
View Code
总结:
1,try ...except 单个情况
2,try except except..... 多分支,针对多个你已知的异常,分别导向不同的代码. *
3,try except Exception as e: 万能异常处理. 你对出现的异常错误未知,你要用万能的. *
# 1,只是显示错误信息,不终止程序就行. 万能的
# 2,针对不同的错误,提示不同的信息,进行不同的操作. 多分支,多分支+ 万能
4,try except except except Exception as e: 多分支 + 万能 *
5,try except except... else 出现异常就不执行else代码反之则执行.
6,
try except except... else,finally 不常用
try finally * 涉及到关闭文件句柄,网络链接,数据库链接等等.
7, raise
8, 自定义异常处理.
9 assert
'''
try...except的比较if的方式的好处:
try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性
异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性
使用try..except的方式
1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;