阅读目录
一 什么是异常
二 异常的种类
三 异常处理
四 什么时候用异常处理
一 什么是异常
异常就是程序运行时发生错误的信号(在程序出现错误时, 则会产生一个异常, 若程序没有处理它, 则会抛出该异常, 程序的运行也随之终止), 在 python 中, 错误触发的异常如下
而错误分成两种
- # 语法错误示范一
- if
- # 语法错误示范二
- def test:
- pass
- # 语法错误示范三
- class Foo
- pass
- # 语法错误示范四
- print(haha
- #TypeError:int 类型不可迭代
- for i in 3:
- pass
- #ValueError
- num=input(">>:") #输入 hello
- int(num)
- #NameError
- aaa
- #IndexError
- l=['egon','aa']
- l[3]
- #KeyError
- dic={'name':'egon'}
- dic['age']
- #AttributeError
- class Foo:pass
- Foo.x
- #ZeroDivisionError: 无法完成计算
- res1=1/0
- res2=1+'str'
二 异常的种类
在 python 中不同的异常可以用不同的类型 (python 中统一了类与类型, 类型即类) 去标识, 一个异常标识一种错误
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
三 异常处理
为了保证程序的健壮性与容错性, 即在遇到错误时程序不会崩溃, 我们需要对异常进行处理,
如果错误发生的条件是可预知的, 我们需要用 if 进行处理: 在错误发生之前进行预防
- AGE=10
- while True:
- age=input('>>:').strip()
- if age.isdigit(): #只有在 age 为字符串形式的整数时, 下列代码才不会出错, 该条件是可预知的
- age=int(age)
- if age == AGE:
- print('you got it')
- break
如果错误发生的条件是不可预知的, 则需要用到 try...except: 在错误发生之后进行处理
- # 基本语法为
- try:
被检测的代码块
except 异常类型:
try 中一旦检测到异常, 就执行这个位置的逻辑
- # 举例
- try:
- f=open('a.txt')
- g=(line.strip() for line in f)
- print(next(g))
- print(next(g))
- print(next(g))
- print(next(g))
- print(next(g))
- except StopIteration:
- f.close()
- #1 异常类只能用来处理指定的异常情况, 如果非指定异常则无法处理.
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e: # 未捕获到异常, 程序直接报错
- print e
- #2 多分支
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
- #3 万能异常 Exception
- s1 = 'hello'
- try:
- int(s1)
- except Exception as e:
- print(e)
- #4 多分支异常与万能异常
- #4.1 如果你想要的效果是, 无论出现什么异常, 我们统一丢弃, 或者使用同一段代码逻辑去处理他们, 那么骚年, 大胆的去做吧, 只有一个 Exception 就足够了.
- #4.2 如果你想要的效果是, 对于不同的异常我们需要定制不同的处理逻辑, 那就需要用到多分支了.
- #5 也可以在多分支后来一个 Exception
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
- except Exception as e:
- print(e)
- #6 异常的其他机构
- s1 = 'hello'
- try:
- int(s1)
- except IndexError as e:
- print(e)
- except KeyError as e:
- print(e)
- except ValueError as e:
- print(e)
- #except Exception as e:
- # print(e)
- else:
- print('try 内代码块没有异常则执行我')
- finally:
- print('无论异常与否, 都会执行该模块, 通常是进行清理工作')
- #7 主动触发异常
- try:
- raise TypeError('类型错误')
- except Exception as e:
- print(e)
- #8 自定义异常
- class EgonException(BaseException):
- def __init__(self,msg):
- self.msg=msg
- def __str__(self):
- return self.msg
- try:
- raise EgonException('类型错误')
- except EgonException as e:
- print(e)
- #9 断言: assert 条件
- assert 1 == 1
- assert 1 == 2
- #10 总结 try..except
1: 把错误处理和真正的工作分开来
2: 代码更易组织, 更清晰, 复杂的工作任务更容易实现;
3: 毫无疑问, 更安全了, 不至于由于一些小的疏忽而使程序意外崩溃了;
四 什么时候用异常处理
有的同学会这么想, 学完了异常处理后, 好强大, 我要为我的每一段程序都加上 try...except, 干毛线去思考它会不会有逻辑错误啊, 这样就很好啊, 多省脑细胞 ===》2B 青年欢乐多
首先 try...except 是你附加给你的程序的一种异常处理的逻辑, 与你的主要的工作是没有关系的, 这种东西加的多了, 会导致你的代码可读性变差
然后异常处理本就不是你 2b 逻辑的擦屁股纸, 只有在错误发生的条件无法预知的情况下, 才应该加上 try...except
来源: http://www.bubuko.com/infodetail-2990769.html