我是靠谱客的博主 传统指甲油,最近开发中收集的这篇文章主要介绍python的异常处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

异常处理

什么是异常

异常是发生错误的信号,一旦程序出现错误,并且程序没有处理这种错误,那就会抛出异常,并且程序终止

错误分类

  • 语法错误
  • 逻辑错误
语法错误
  • SyntaxError

语法错误就是不符合python基本的语法要求的,这种错误会直接导致程序无法运行,所以必须在程序运行前进行改正

>>> print"haha"
SyntaxError: invalid syntax

>>> if True
SyntaxError: invalid syntax

逻辑错误

常见的逻辑错误

  • TypeError
>>> for i in 6:
	pass

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    for i in 6:
TypeError: 'int' object is not iterable
  • KeyError
>>> k = {"Age":18,"Name":"YOHO"}
>>> k["school"]
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    k["school"]
KeyError: 'school'
  • NameError
>>> name
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    name
NameError: name 'name' is not defined
  • IndexError
>>> l = [i for i in range(10)]
>>> l[11]
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    l[11]
IndexError: list index out of range
错误类型错误说明
AssertionError断言语句(assert)失败
AttributeError尝试访问未知的对象属性
EOFError用户输入文件末尾标志EOF(Ctrl+d)
FloatingPointError浮点计算错误
GeneratorExit generator.close()方法被调用的时候
ImportError导入模块失败的时候
IndexError索引超出序列的范围
KeyError字典中查找一个不存在的关键字
KeyboardInterrupt用户输入中断键(Ctrl+c)
MemoryError内存溢出(可通过删除对象释放内存)
NameError尝试访问一个不存在的变量
NotImplementedError尚未实现的方法
OSError操作系统产生的异常(例如打开一个不存在的文件)
OverflowError数值运算超出最大限制
ReferenceError弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError一般的运行时错误
StopIteration迭代器没有更多的值
SyntaxErrorPython的语法错误
IndentationError缩进错误
TabErrorTab和空格混合使用
SystemErrorPython编译器系统错误
SystemExitPython编译器进程被关闭
TypeError不同类型间的无效操作
UnboundLocalError访问一个未初始化的本地变量(NameError的子类)
UnicodeErrorUnicode相关的错误(ValueError的子类)
UnicodeEncodeErrorUnicode编码时的错误(UnicodeError的子类)
UnicodeDecodeErrorUnicode解码时的错误(UnicodeError的子类)
UnicodeTranslateErrorUnicode转换时的错误(UnicodeError的子类)
ValueError传入无效的参数
ZeroDivisionError除数为零

异常处理原则

  • 对于可预知的错误,应该用if判断来进行预防
age = input("请输入年龄:").strip() # 用户可能输入非数字的字符串
if age.isdigital(): # 通过增加判断,当为数字字符串时,才进行整数转换,来避免报错
    age = int(age)
    print(age)
  • 对于不可预知的错误,则用python的异常处理机制try,except.
try:  #文件的内容不可预知,故无法用if来规避,则只能使用try
    f = open("a.txt","r",encoding="utf-8")
    next(f)
    next(f)
    next(f)
    next(f)
except StopIteration:
    print("出错啦")
    

try,except 详细用法

  1. 异常类只能处理指定的异常情况
略, 见下
  1. 多分支

被监测的代码块,抛出的异常有多种可能性,并且需要我们针对每一种异常都定制专门的处理逻辑

try:
    l = [1,3,4]
    l[5]
    name
    d = {}
    d["a"]
except IndexError as e: # 这里as 后边的变量可以打印系统提示的错误原因
    print("出错原因:",e)
except NameError as e:
    print("出错原因:",e)
except KeyError as e:
    print("出错原因:",e)

print("异常处理后的代码。。。")

  1. 万能异常

被监测的代码块,抛出的异常有多种可能性,但我们只需要对异常统一按照一种处理逻辑进行处理,这时用万能异常Exception

try:
    l = [1,3,4]
    l[5]
    name
    d = {}
    d["a"]
except Exception as e:
    print("出错原因:",e)

print("异常处理后的代码。。。")

多分支和万能可以组合使用,类似elif,else组合

try:
    l = [1,3,4]
    l[5]
    name
    d = {}
    d["a"]
except IndexError as e:
    print("出错原因:",e)
except NameError as e:
    print("出错原因:",e)
except KeyError as e:
    print("出错原因:",e)
except Exception as e:
    print("出错原因:",e)

print("异常处理后的代码。。。")
  1. 其他用法

else

try:
    l = [1,3,4]
    l[5]
    name
    d = {}
    d["a"]
except IndexError as e:
    print("出错原因:",e)
except NameError as e:
    print("出错原因:",e)
except KeyError as e:
    print("出错原因:",e)
except Exception as e:
    print("其他错误原因:",e)
else:
    print("当代码段没有异常时,执行此段代码")
finally:
    print("不管代码段有没有异常,都会被执行")

print("异常处理后的代码。。。")
  1. 主动触发异常
    raise 异常类型(值)
class People():
    def __init__(self,name,age)
    if not isinstance(name,str):
        raise TypeError("名字必须传入str类型")
    if not isinstance(age,int)
        raise TypeError("年龄必须传入int类型")
    self.name = name
    self.age = age
  1. 自定义异常
class Myexception(BaseException) #继承python自带的异常类型
    def __init__(self,msg):
        super(Myexception,self).__init__()
        self.msg = msg
    
    def __str__(self):
        return "<%s>" % self.msg

raise Myexception("我自己的异常处理类型")

最后

以上就是传统指甲油为你收集整理的python的异常处理的全部内容,希望文章能够帮你解决python的异常处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部