博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python攻克之路-异常处理
阅读量:5085 次
发布时间:2019-06-13

本文共 3794 字,大约阅读时间需要 12 分钟。

异常处理

1. 功能:防止出错而导致整个程序运行不了,实际程序在后台捕获到
分析:try的代码优先执行,如果出借,python内部会作出处理,创建一个Exception类的一个对象e,e这个对象中封装了错误信息

try:        #代码块,逻辑        pass    except Exception as e:        # 上述代码块出错后,自动执行当前块,通俗理解,如果上面操作不行,执行以下操作        i = 1

示例:用户输入数字可以正常转换,否则就默认打印1

[root@node2 class2]# cat try.py#!/usr/local/python3/bin/python3while True:    try:        inp = input('enter a number: ')        i = int(inp)    except Exception as e:        i = 1        print(e)        print(i)[root@node2 class2]# python3 try.py enter a number: 2enter a number: 4enter a number: dkinvalid literal for int() with base 10: 'dk'   #e的错误信息

 

2.错误类型:每种错误都有一个对象来表示

In [1]: li=[11,22]In [2]: li[99]IndexError: list index out of rangeIn [3]: int('dkd')ValueError: invalid literal for int() with base 10: 'dkd'

场景:把Exception转换成具体的错误类型才捕获,如果不是具体指定的错误类型,就直接是全部错误

分析:IndexError和ValueError只能捕获相对应的错误,而Exception是全部都可以捕获,而且它们都是Exception的子类

In [5]: try:   ...:     li = [11,22]   ...:     li[99]   ...: except IndexError as e:   #如果是IndexError就可以捕获到   ...:     print(e)   ...:     list index out of rangeIn [6]: try:   ...:     int('dkd')            #替换后,不能正常捕获   ...: except IndexError as e:   ...:     print(e)ValueError: invalid literal for int() with base 10: 'dkd'

  

3. 日志使用

描述:程序出错写入日志时,把错误类型分类的写入到不同的文件中,把重要的错误分到主文件,其他的小错误分配到一个文件
实现:先写出具体的错误捕获类型,最后写一个Exception,也就是如果之前的可以捕获就直接输出,不能捕获交给Exception

       

 

4.主动触发异常

分析:Exception类加括号,表示创建对象,再把这个对象赋值给e,e就是错误的对象

In [7]: try:   ...:     raise Exception('failed')  #主动触发异常   ...: except Exception as e:   ...:     print(e)   ...:     failed

使用场景:函数可以嵌套函数

分析:出现错误就需要记录日志,not result表示没有执行成功,就要在下面open file写入日志,如果操作日志的实现比较复杂,那么就会增加代码量,这是db操作的错误,实际在Index里还可以有其他的代码如下面的int操作,也可能会出现错误,也要在except后面打开日志文件写入异常,not result的结果有错误也要写入日志中,操作两次
优化:两个都使用except后面的写入日志的功能,在not result后直接raise,这样raise Exception('db handle error')中的db handle error就是错误信息,这样str_error就直接是这个db错误,同时调用写入日志的操作

def db():#db是操作数据库,可能成功或者失败    return True  #操作成功,false则失败,如果出错需要记录到异常中,而且把错误信息写入到日志中def index():    try:        r = input(">>")    #也会有错误        int(r)            try:        result = db()      #如果result是True表示成功,如果是false是失败,失败需要记录到日志        if not result:             #打开文件,写入日志,有了raise,这个打开写入日志的操作就可以省略            raise Exception('db handle error')    except Exception as e: #e是错误信息        str_error = str(e) #取得字符串的错误信息        print(str_error)        # 记录日志,需要打开一个文件才写,如果不raise Exception就要重复做这个操作index() #执行

  

5.自定义异常

描述:Exception捕获所有异常,IndexError继承它的异常,可以自定义编写一个类,让它继承Exception

[root@node2 class2]# cat error-handle.py#!/usr/local/python3/bin/python3class newError(Exception):    def __init__(self,msg):        self.message = msg    def __str__(self):        return self.messageobj = newError('xxx')print(obj)            #默认调用str方法,把xxx值赋予message,返回message[root@node2 class2]# python3 error-handle.pyxxx

设置异常

[root@node2 class2]# cat error-handle.py#!/usr/local/python3/bin/python3class newError(Exception):    def __init__(self,msg):        self.message = msg    def __str__(self):        return self.messagetry:    raise newError('i am wrong')   #相当于执行了obj = newError('xxx'),创建对象,把对象赋值给e(相当于obj)except newError as e:    #当于newError相关的异常就捕获    print(e)             #执行e对象的__str__的方法,获取返回值[root@node2 class2]# python3 error-handle.pyi am wrong

  

6.断言:assert 条件

描述:如果条件成立,代码什么都不执行,继续向下执行,如果不成立,整个程序就要出错,最终目的是要使用程序就强制要满足某个条件,否则,并且可以捕获,但是一般不捕获
例子:假设软件只支持ios,不支持安卓,安装上了安卓,但是一操作马上报错

[root@node2 class2]# cat ass.py #!/usr/local/python3/bin/python3print(23)assert 1==1  #条件成立就通过,不成立就报错print(565)[root@node2 class2]# python3 ass.py23565[root@node2 class2]# cat ass.py#!/usr/local/python3/bin/python3print(23)assert 1==2print(565)[root@node2 class2]# python3 ass.py23Traceback (most recent call last):  File "ass.py", line 3, in 
assert 1==2AssertionError

  

 

 

转载于:https://www.cnblogs.com/reid21/articles/8993536.html

你可能感兴趣的文章
2009程序员考试大纲
查看>>
Shell入门
查看>>
Cocos工程命名规则整理(node部分)
查看>>
感觉不错的随笔 关于C、C++的
查看>>
Flask從入門到入土(四)——登錄實現
查看>>
单例模式-懒汉式的一次多线程Debug
查看>>
sourcetree配置gitlab
查看>>
tk画图
查看>>
iOS.访问 Web Service.异步POST请求方法
查看>>
json 的key值不能是变量
查看>>
按时间分段算费用
查看>>
Vue安装
查看>>
浏览器的各种刷新
查看>>
MVC 多层架构1
查看>>
jcp 打印机字体变淡变模糊bootstrap
查看>>
oracle 空表无法导出
查看>>
Windows7下安装IIS出现“出现错误,并非所有的功能被成功更改
查看>>
CF Round 424 E Cards Sorting
查看>>
javascript解析JSON---将字符串转换为json对象
查看>>
在C语言中使用scanf语句时遇到的问题总结
查看>>