异常之问
什么是异常?
异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)在Python 中,错误触发的异常如下:
Traceback 为异常的追踪信息
NameError 为异常的类型
name 'a' is not defined 为异常值
在 Python 中的错误分为两种:
语法错误:这种错误,通过不了 python 的语法检测,这种错误也捕捉不了,必须在程序执行前改正.
逻辑异常:语法没问题,通过了 Python的语法检测,但因为对 python 数据类型的错误使用导致出错.
异常的种类
在 Python 中不同的异常可以用不同的类型( python 中统一了类与类型,类型即类)去标识,一个异常标识一种错误.
常用异常:
AttributeError 试图访问一个对象没有的属性
IOError 输入/输出异常;通常为无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误的子类;代码没有正确对其
IndexError 下标索引超出序列边界
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 PendingDeprecationWarningReferenceErrorRuntimeError RuntimeWarning StandardErrorStopIterationSyntaxErrorSyntaxWarning SystemError SystemExit TabErrorTypeErrorUnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning ZeroDivisionError
异常处理
为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理.如果错误发生的条件是可预知的,需要用 if 进行处理:在错误发生之前进行预防;如果错误的发生条件不可预知,则需要用 try...except: 在错误发生之后进行处理.
# 基本语法try: 被检测的代码块except 异常类型: try 中一旦检测到异常,就执行这个位置的逻辑
几个栗子:
# 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理s1 = 'hello'try: int(s1)except IndexError as e: # 捕获异常失败,报错 print(e) # 多分支s1 = 'hello'try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)# 万能异常 Exceptions1 = 'hello'try: int(s1)except Exception as e: print(e) # 多分支异常与万能异常# 如果想要的效果是:无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理它们,那么一个 Exception 就够了.# 如果想要对不同的异常使用不同的处理逻辑,那么就需要用到多分支异常.# 为了防止对异常类型判断错误,可以在多分支后面跟上 Exceptions1 = '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) # 异常的其他结构s1 = 'hello'try: int(s1)except IndexError as e: print(e)except KeyError as e: print(e)except ValueError as e: print(e)else: print('没有产生异常则执行')finally: print('无论异常与否,都会执行该代码') # 主动触发异常try: raise TypeError('类型错误')except Exception as e: print(e)# 自定义异常class ExceptionMusibii(BaseException): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg try: raise ExceptionMusibii('类型错误')except ExceptionMusibii as e: print(e)# 断言: assert 条件assert 1 == 1assert 2 == 2# 总结:try...except# 1. 把错误处理和真正的工作分开来;# 2. 代码更易组织,更清晰,复杂的工作任务更容易实现;# 3. 代码更加健壮,不易崩溃.
什么时候用异常处理
只有在错误发生的条件无法预知的情况下才应该加上 try...except