python3.8 学习心得(4) 异常处理

tech2023-01-25  56

一、常见的内置异常

BaseException:所有异常的基类。

System Exit:Python解释器请求退出。

KeyboardInterrupt:用户中断执行。

Exception:常规错误的基类。

StopIteration:迭代器没有更多的值。

GeneratorExit:生成器(generator)发生异常通知退出。

StandardError:所有内置标准异常的基类。

ArithmeticError:所有数值计算错误的基类。

FloatingPointError:浮点计算错误。

OverflowError:数值运算超出最大限制

ZeroDivisionError:除(或取模)零(所有数据类型)。

AssertionError:断言语句失败。

AttributeError:对象没有这个属性。

EOFError:没有内建输入,到达EOF标记。

EnvironmentError:操作系统错误的基类。

IOError:输入/输出操作失败。

OSError:操作系统错误。

WindowsError:系统调用失败。

ImportError:导入模块/对象失败。

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:用户代码生成的警告。

 

二、使用try...except语句处理异常

此语句可以用于处理python所输出的异常。

语法格式如下:

try: <语句> except[<异常的名称>[,<异常类的实例变量名称>]]: <异常的处理语句> [else: <没有异常产生时的处理语句>]

1.执行try子句,在关键字try和关键字except之间的语句。

2.如果没有异常发生,就忽略except子句,try子句执行后结束。

3.如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和excet之后的名称相符,那么对应的except子句将被执行。

4.如果一个异常没有与任何的except匹配,那么这个异常将会传递到上层的try中。

值得注意的是:异常的名称可以是空白的,表示此except语句处理所有类型的异常。异常的名称也可以是一个或多个。可以使用不同的except语句处理不同的异常。else语句之内的语句是没有异常发生时的处理程序。

三、使用else语句来处理异常

使用else语句时,一定要有except语句才行。在没有发生异常时,会执行else子句的流程。由此可见,当程序没有发送异常时,通过添加一个else子句,可以帮助我们更好地判断程序的执行情况。

def get(n): try: if n==100: data=s[4] elif 200<=n<=500: file=open(100,200,300) except: print("有错误发生") else: print("没有错误发生") get(100) get(200) get(300) 输出结果如下显示: 有错误发生 有错误发生 没有错误发生

四、使用pass语句来处理异常

a=["100","200","苹果","香蕉","100"] sm=0 for n in a: try: sm+=int(n) except: pass print(sm) 输出结果如下显示: 400

从运行结果可以看出,sm的值时是可转换的三个元素("100","200"和"100")的和。上述代码中的Int()函数将字符串转换为整数。当int()函数无法将字符串转换为整数时,就会输出valueError的异常。在except语句内使用pass语句可以忽略所发生的valueError异常。

五、清除异常,使用try...finally语句

try...finally语句可以当作清除异常使用。不管try语句内是否运行失败,finally语句一定会被运行。注意,try与except语句可以搭配使用,try与finally语句也可以搭配使用,但是except与finally语句不能放在一起使用

下面是示例是没有异常发生,finally语句内的程序代码还是被执行。

try: a=100 finally: print('异常以及清楚啦') 输出结果如下显示 异常以及清楚啦

下面示例发生了valueError异常,finally语句内的程序代码还是被执行。

try: raise ValueError finally: print('异常已经清楚啦') 输出结果如下所示: raise ValueError valueError

六、抛出异常

使用raise语句可以抛出一个指定的异常。例如:

raise NameError('这里使用raise抛出一个异常’) 输出结果如下所示: raise NameError('这里使用raise抛出一个异常’) NameError:这里使用raise抛出一个异常

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或异常的类(Exception的子类)。

值得注意的是:如果用户只想判断是否会抛出一个异常,而不想去处理它,那么此时使用raise语句是最佳的选择。

七、离开嵌套循环

我们知道,如果想离开循环,就使用break语句,但是如果在一个嵌套循环之内,break语句只能离开最内层的循环,而不能离开嵌套循环,此时就可以使用raise语句离开嵌套循环。

示例如下:

class ExitLoop(Exception): pass try: i=1 while i<10: for j in range(1,10): print(i,j) if (i==2) and (j==2): raise(ExitLoop) i+=1 Except ExitLoop: print("当i=2 j=2时离开嵌套循环") 输出结果如下显示: 1 1 2 2 当i=2 j=2时离开嵌套循环

python支持使用类输出异常。类可以时python的内置异常,也可以时用户自定义异常。使用类输出异常是比较好的方式,因此捕捉异常时更有弹性。

八、自定义异常

除了内置异常,python也支持用户自定义异常。用户自定义异常与内置异常并五差别,只是内置异常时定义在exception模块中。当python解释器启动时,exceptions模块就会事先加载。

python允许用户定义自己的异常类,并且用户自定义的异常类必须从任何一个Python内置异常类派生而来。

下面的示例是使用python的内置exception异常类作为基类,创建一个用户自定义的异常类URLError.

class URLError(Exception): pass try: raise URLError("这是URL异常") except URLError as inst: print(inst.args[0]) 输出结果如下所示: 这是URL异常

inst变量是用户自定义异常类URLError的实例变量,inst.args就是该用户定义异常类的args属性值。还可以将所创建的用户自定义异常类,再当作其他用户自定义异常类的基类。。

最新回复(0)