首页 > 其他 > 详细

异常处理

时间:2019-02-20 22:26:30      阅读:119      评论:0      收藏:0      [点我收藏+]

程序中难免出现错误,错误分为两种:

  语法错误,这种错误无法避免,必须在程序执行前就要改正

  逻辑错误

python中异常种类:

  python中不同的异常可以使用不同的类型,常用异常如下:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

异常处理:

  01.什么是异常处理?

    python解释器检测到错误,触发异常(同时也允许程序员自己触发异常),可以编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功就进入另外一个处理分支,执行定制的逻辑,使程序不会崩溃,这就是异常处理

  02.为什么要进行异常处理?

    python解析器执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,所以必须提供一种异常处理机制来增强你程序的健壮性与容错性.

  03.如何进行异常处理?

基本语法:

try:
    被检测的代码
except 异常类型:
    try检测到异常,就会执行这个位置的逻辑

  04.分类:

  (1)try单支:

try:
    lst = [1,2,3,4,5,6]
    lst[10]
except IndexError:        超范围异常,会跳过异常,直接执行print(666)
    print(666)

 

  (2)try多支:

try:
    lst = [1,2,3,4,5,6]
    lst[10]
    dic = {}
    print(dic[key])
except KeyError as e:      如果dic={},print(dic[‘key‘])在lst[10]上面,就先执行KeyError错误
    print(e)
except IndexError:
    print(123)          超出范围,执行print(123)

 

  (3)万能异常:

try:
    lst = [1,2,3]
    lst[6]
except Exception:
    print(666)
print(111)           不显示错误信息,跳过异常,往下执行

 

  (4)try多分支 + 万能异常:

def login():
    print(欢迎进入登录界面)
def register():
    print(欢迎进入注册界面)
dic = {1:login,2:register}
while True:
    print(‘‘‘
    1.登录
    2.注册
    ‘‘‘)
    try:
        num = int(input(请输入选项>>>))
        dic[num]()
    except ValueError:
        print(请输入数字>>>)
    except KeyError:
        print(请输入正确序号>>>)

 

  (5)try except else:

try:              出现异常就执行else,否则就不执行
    a
    print(111)
except Exception:
    print(222)
else:
    print(333)
print(666)               结果:222,666 

 

  (6)try except finally: 不管是否出现异常都会执行,在异常出现之前会执行finally,通常是清理工作

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(try内代码块没有异常则执行我)
finally:
    print(无论异常与否,都会执行该模块,通常是进行清理工作)

用途1: 关闭文件句柄,关闭数据库链接

try:
    f = open(user_id,mode=w,encoding=utf-8)
    f.write(...)   文件句柄操作的内容非常多
except Exception:
    print(123)
finally:
    print(333) 

用途2: 函数执行return之前能执行finally代码

def func():
     try:
         return 666
     finally:
         print(333)
 print(func())            结果为:333,666,在return之前执行finally

用途3: 循环中break之前可执行finally代码

while True:
    try:
        if 2 > 1:
            break
    finally:
        print(333)        在break执行之前,执行finally

 

  (7)raise主动抛出异常: 

try:
    raise TypeError(类型错误)
except Exception as e:
    print(e)

 

  (8)断言assert: 

class A:
    name = None
    def get(self):
        assert A.name is not None:    assert 1==1
        num = 123 
        for i in range(10):
            num += 1
            print(num)
obj = A()
# A.name = ‘Barry‘
obj.get()              结果为:133

 

  (9)自定义异常:

  当遇到一些大的项目,出现的错误是python解释器没有定义的数据类型,可以自定义一个异常处理的类,继承BaseException. 

class PhoneConnection(BaseException):
    pass
try:
    raise PhoneConnection(手机连接错误)
except Exception as e:
    print(e)

小结:

  异常处理不能经常使用,耗费性能;异常处理的分支越多,代码越冗余,可读性越差,所以能用程序解决的问题,尽量用程序解决

  使用 try...except 的方式:

    01.把异常处理和真正的工作区分开来

    02.代码更容易组织,更清晰,复杂的工作任务更容易实现

    03.使程序更加安全,不会因为一些小的疏漏而使程序意外崩溃

 

异常处理

原文:https://www.cnblogs.com/py8318/p/10409447.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!