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

python 调用Ctypes函数句柄 一般怎么设置 python调用inca_错误类型



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



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



[root@node2 class2]# cat try.py
#!/usr/local/python3/bin/python3
while 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: 2
enter a number: 4
enter a number: dk
invalid literal for int() with base 10: 'dk'   #e的错误信息



 

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



In [1]: li=[11,22]
In [2]: li[99]
IndexError: list index out of range

In [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 range

In [6]: try:
   ...:     int('dkd')            #替换后,不能正常捕获
   ...: except IndexError as e:
   ...:     print(e)
ValueError: invalid literal for int() with base 10: 'dkd'



  

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

python 调用Ctypes函数句柄 一般怎么设置 python调用inca_错误类型_02

       

python 调用Ctypes函数句柄 一般怎么设置 python调用inca_python_03

 

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错误,同时调用写入日志的操作

python 调用Ctypes函数句柄 一般怎么设置 python调用inca_python_04


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/python3
class newError(Exception):
    def __init__(self,msg):
        self.message = msg
    def __str__(self):
        return self.message

obj = newError('xxx')
print(obj)            #默认调用str方法,把xxx值赋予message,返回message
[root@node2 class2]# python3 error-handle.py
xxx


设置异常


[root@node2 class2]# cat error-handle.py
#!/usr/local/python3/bin/python3
class newError(Exception):
    def __init__(self,msg):
        self.message = msg
    def __str__(self):
        return self.message

try:
    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.py
i am wrong


  

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


[root@node2 class2]# cat ass.py 
#!/usr/local/python3/bin/python3
print(23)
assert 1==1  #条件成立就通过,不成立就报错
print(565)
[root@node2 class2]# python3 ass.py
23
565

[root@node2 class2]# cat ass.py
#!/usr/local/python3/bin/python3
print(23)
assert 1==2
print(565)
[root@node2 class2]# python3 ass.py
23
Traceback (most recent call last):
  File "ass.py", line 3, in <module>
    assert 1==2
AssertionError