转载:https://www.cnblogs.com/wj-1314/p/8707804.html
一:什么是异常?
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在python无法正常处理程序时就会发生一个异常(异常是python对象,表示一个错误)
异常就是程序运行时候发生错误的信号(在程序出现错误的时候,则会产生一个异常,若程序没有处理他,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下:

而错误分为两种(语法错误和逻辑错误):
1,语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)
1 2 3 4 5 6 7 8 9 10 | #语法错误示范一if#语法错误示范二def test: pass#语法错误示范三class Foo pass#语法错误示范四print(haha |
2,逻辑错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #TypeError:int类型不可迭代for i in 3: pass#ValueErrornum=input(">>: ") #输入helloint(num)#NameErroraaa#IndexErrorl=['egon','aa']l[3]#KeyErrordic={'name':'egon'}dic['age']#AttributeErrorclass Foo:passFoo.x#ZeroDivisionError:无法完成计算res1=1/0res2=1+'str' |
二:异常的种类有哪些?
在python中不同的异常可以用不同的类型(python中统一了类与类别,类型即类)取标识,一个异常标识一种错误。
1,常见语法错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常;基本上是无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误(的子类) ;代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 使用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一 个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不期望的值,即使值的类型是正确的 |
2,更多错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | ArithmeticErrorAssertionErrorAttributeErrorBaseExceptionBufferErrorBytesWarningDeprecationWarningEnvironmentErrorEOFErrorExceptionFloatingPointErrorFutureWarningGeneratorExitImportErrorImportWarningIndentationErrorIndexErrorIOErrorKeyboardInterruptKeyErrorLookupErrorMemoryErrorNameErrorNotImplementedErrorOSErrorOverflowErrorPendingDeprecationWarningReferenceErrorRuntimeErrorRuntimeWarningStandardErrorStopIterationSyntaxErrorSyntaxWarningSystemErrorSystemExitTabErrorTypeErrorUnboundLocalErrorUnicodeDecodeErrorUnicodeEncodeErrorUnicodeErrorUnicodeTranslateErrorUnicodeWarningUserWarningValueErrorWarningZeroDivisionError |
3,python所有标准异常类
| 异常名称 | 描述 |
|---|---|
| BaseException | 所有异常的基类 |
| SystemExit | 解释器请求退出 |
| KeyboardInterrupt | 用户中断执行(通常是输入^C) |
| Exception | 常规错误的基类 |
| StopIteration | 迭代器没有更多的值 |
| GeneratorExit | 生成器(generator)发生异常来通知退出 |
| SystemExit | Python 解释器请求退出 |
| StandardError | 所有的内建标准异常的基类 |
| ArithmeticError | 所有数值计算错误的基类 |
| FloatingPointError | 浮点计算错误 |
| OverflowError | 数值运算超出最大限制 |
| ZeroDivisionError | 除(或取模)零 (所有数据类型) |
| AssertionError | 断言语句失败 |
| AttributeError | 对象没有这个属性 |
| EOFError | 没有内建输入,到达EOF 标记 |
| EnvironmentError | 操作系统错误的基类 |
| IOError | 输入/输出操作失败 |
| OSError | 操作系统错误 |
| WindowsError | 系统调用失败 |
| ImportError | 导入模块/对象失败 |
| KeyboardInterrupt | 用户中断执行(通常是输入^C) |
| LookupError | 无效数据查询的基类 |
| IndexError | 序列中没有没有此索引(index) |
| KeyError | 映射中没有这个键 |
| MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
| NameError | 未声明/初始化对象 (没有属性) |
| UnboundLocalError | 访问未初始化的本地变量 |
| ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
| RuntimeError | 一般的运行时错误 |
| NotImplementedError | 尚未实现的方法 |
| SyntaxError | Python 语法错误 |
| IndentationError | 缩进错误 |
| TabError | Tab 和空格混用 |
| SystemError | 一般的解释器系统错误 |
| TypeError | 对类型无效的操作 |
| ValueError | 传入无效的参数 |
| UnicodeError | Unicode 相关的错误 |
| UnicodeDecodeError | Unicode 解码时的错误 |
| UnicodeEncodeError | Unicode 编码时错误 |
| UnicodeTranslateError | Unicode 转换时错误 |
| Warning | 警告的基类 |
| DeprecationWarning | 关于被弃用的特征的警告 |
| FutureWarning | 关于构造将来语义会有改变的警告 |
| OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
| PendingDeprecationWarning | 关于特性将会被废弃的警告 |
| RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
| SyntaxWarning | 可疑的语法的警告 |
| UserWarning | 用户代码生成的警告 |
三:异常处理的定义
python解释器检测到错误,触发异常(也允许程序员自己触发异常)
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
四:异常处理的用法
为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,
1,如果错误发生的条件是可预知的,我们需要用if进行处理,在错误发生之前进行预防
1 2 3 4 5 6 7 8 | AGE=10while True: age=input('>>: ').strip() if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的 age=int(age) if age == AGE: print('you got it') break |
2,如果错误发生的条件是不可预知的,则需要用到try..except:在错误发生之后进行处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #基本语法为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() |
五,try...except...的详细用法
我们把可能发生错误的语句放在try模块里,用except来处理异常。except可以处理一个专门的异常,也可以处理一组圆括号中的异常,如果except后没有指定异常,则默认处理所有的异常。每一个try,都必须至少有一个except
1,异常类只能来处理指定的异常情况,如果非指定异常则无法处理
1 2 3 4 5 | s1 = 'hello'try: int(s1)except IndexError as e: # 未捕获到异常,程序直接报错 print e |
2,多分支
1 2 3 4 5 6 7 8 9 | 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
1 2 3 4 5 | s1 = 'hello'try: int(s1)except Exception as e: print(e) |
4,多分支+Exception
1 2 3 4 5 6 7 8 9 10 11 | 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) |
5,异常的其他机构(try...finally语法)
try...finally语句无论是否发生异常都将会执行最后的代码。语法如下:
1 2 3 4 5 | try:<语句>finally:<语句> #退出try时总会执行raise |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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('无论异常与否,都会执行该模块,通常是进行清理工作') |
6,主动触发异常(raise语句)
我们可以使用raise语句自己触发异常,raise语法格式如下:
1 | raise [Exception [, args [, traceback]]] |
语句中Exception是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
示例:
一个异常可以是一个字符串,类或对象。 Python的内核提供的异常,大多数都是实例化的类,这是一个类的实例的参数。
定义一个异常非常简单,如下所示:
1 2 3 4 | def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行 |
1 2 3 4 | try: raise TypeError('类型错误')except Exception as e: print(e) |
7,自定义异常
通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。
以下为与BaseException相关的实例,实例中创建了一个类,基类为BaseException,用于在异常触发时输出更多的信息。
在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。
1 2 3 4 5 6 7 8 9 10 | class Networkerror(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msgtry: raise Networkerror('类型错误')except Networkerror as e: print(e) |
8,断言:assert条件
1 2 | assert 1 == 1 assert 1 == 2 |
9,总结try...except
1 2 3 4 5 | 1,把错误处理和真正的工作分开来2,代码更易组织,更清晰,复杂的工作任务更容易实现3,毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了 |
六:什么时候用异常处理?
有的同学会这么想,学完了异常处理后,好强大,我要为我的每一段程序都加上try...except,干毛线去思考它会不会有逻辑错误啊,这样就很好啊,多省脑细胞===》2B青年欢乐多
首先try...except是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的,这种 东西加的多了,会导致你的代码可读性变差
然后异常处理本就不是你2b逻辑的擦屁股纸,只有在错误发生的条件无法预知的情况下,才应该加上try...except
本文深入讲解Python中的异常处理机制,包括异常的概念、种类、处理方式等,并提供了多种异常处理的实际案例。
5万+

被折叠的 条评论
为什么被折叠?



