Python3学习笔记:异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daihuimaozideren/article/details/80790656

错误类型

编程过程中,通常存在三种错误。语法错误,逻辑错误和异常。

语法错误,通常IDE会给出提示,例如丢失“:”。


逻辑错误和异常,则多是因为设计缺陷造成。逻辑错误的输出,与期望不同。例如缺少了“==”判断时,compare(1,1),将输出“1<1”。而异常则直接叫停程序。

还以compare方法为例,当输入皆为数字时,不会出错。但类型不同时,输出便不那么友好了。例如compare(1,"1"),提示

TypeError: '>' not supported between instances of 'int' and 'str'

这也是因为python变量没有类型的原因造成的。因此,在设计方法时,应加入异常处理,以避免类似情况的发生。

异常处理的格式

我们通过一个例子,看一下异常处理的编写格式。

if __name__ == '__main__':    
    def compare(a,b):
        try:
            if(a>b):
                print("%d>%d"%(a,b))
            elif(a==b):
                print("%d=%d"%(a,b))
            else:
                print("%d<%d"%(a,b))
        except:
            print("catch a exception")
        else:
            print("no exception")
        finally:
            print("function end")
            print("")
            
            
    compare(1,2)
    compare(1,"1")

相应输出为

1<2
no exception
function end

catch a exception
function end

try与except间为监听代码段。若存在异常,则执行except内的代码;否则,执行else内的代码。不论是否存在异常,finially代码段都会被执行。此外,else代码段和finially代码段不是必须的。

如果需要catch某种异常,则需要在except中指出异常类型。

    A=[1,2,3,4]
    def printItemFromA(index):
        try:
            print("A[%d]="%index,A[index])
        except (TypeError,IndexError) as err:
            print("exction = ",err)
        print()
        
    printItemFromA(1)
    printItemFromA(10)
    printItemFromA("1")

相应输出为

A[1]= 2

exction =  list index out of range

exction =  %d format: a number is required, not str

此外,可以存在多个except,只要异常类型不同即可。

如果不知道可能出现哪种异常,则可以不指定,或指定为Exception类型。

    A=[1,2,3,4]
    def printItemFromA(index):
        try:
            print("A[%d]="%index,A[index])
        except Exception as error:
            print("exction = ",error)
        print()
        
    printItemFromA(1)
    printItemFromA(10)
    printItemFromA("1")

自定义异常

有时我们需要定义自己的异常,用于判断一些自己的业务逻辑,并给出辅助性的错误提示。

在自定义异常时,只需要继承Exception,并重写__init__方法即可。

在需要跑出异常时,调用raise myException()即可。

class myException(Exception):
    '''
    classdocs
    '''

    def __init__(self, *params):
        self.args=params
from  demo.obj.myException import myException
if __name__ == '__main__':    
    def testMyException():
        try:
            raise myException("test my exception")
        except myException as e:
            print("myException info is : ",e)
    
    testMyException()

相应输出为

myException info is :  test my exception

猜你喜欢

转载自blog.csdn.net/daihuimaozideren/article/details/80790656