程序中的异常捕捉与处理

1,什么是异常处理,

异常时错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用程序处理,那么该异常就会被跑出,程序的执行也会随之终止

异常包含三个部分:

1>,traceback异常的追踪信息

2>,异常的类型

3>,异常的信息

错误分为两大类:

1>,语法上的错误:在程序隐形前就应该立即修正

2>,逻辑上的错误

  • 当我们可以预知程序发生错误的条件,应该用if判断去规避错误
  • 当我们无法预知程序发生错误的条件,也就是说错误一定会发生,那么我们应该用try...except去补救

3,为何要异常处理

避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性

try:

代码1

代码2

代码3

except NameError:

当抛出的异常时NameError时执行的子代码块

except ......:

pass

except Exception:

万能异常,不管抛出的是什么异常信息,上面没有接收的,这个都能接收

else:

当执行的代码没有抛出异常时需要执行的代码块

finally:

执行的代码不管有没有异常都需要执行的代码

(一)异常处理单分支

try:
    print('=====1')
    print('=====2')
    print('=====3')
    d = {'x': 1, 'y': 2}
    d['z']  # KeyError
    print('=====4')
    l = [1, 2, 3]
    l[1000]  # IndexError
    print('=====5')
except IndexError:
    print('IndexError')

print('other code')

(二)异常处理多分支

try:
    print('=====1')
    print('=====2')
    print('=====3')
    d = {'x': 1, 'y': 2}
    d['z']  # KeyError
    print('=====4')
    l = [1, 2, 3]
    l[1000]  # IndexError
    print('=====5')
except KeyError as e:      # e是异常信息捕获
    print('KeyError',e)
except IndexError as e:
    print('IndexError',e)
print('other code')

(三)万能异常类型

try:
    print('=====1')
    print('=====2')
    print('=====3')
    d = {'x': 1, 'y': 2}
    # d['z']  # KeyError
    # xxx
    print('=====4')
    l = [1, 2, 3]
    l[1000]  # IndexError
    print('=====5')
except IndexError as e:
    print('IndexError:', e)
except KeyError as e:
    print('KeyError:', e)
except Exception as e:      #万能异常
    print('Exception:',e)

print('other code')

(四)try...else

try:
    print('=====1')
    print('=====2')
    print('=====3')
    d = {'x': 1, 'y': 2}
    # d['z']  # KeyError
    # xxx
    print('=====4')
    l = [1, 2, 3]
    # l[1000]  # IndexError
    print('=====5')
except IndexError as e:
    print('IndexError:', e)
except KeyError as e:
    print('KeyError:', e)
except Exception as e:
    print('Exception:',e)
else:
    print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行')
print('other code')

(五)try....finally

try:
    f=open('a.txt','w')
    print('=====1')
    print('=====2')
    print('=====3')
    d = {'x': 1, 'y': 2}
    # d['z']  # KeyError
    # xxx
    'xx' > 10
    print('=====4')
    l = [1, 2, 3]
    # l[1000]  # IndexError
    print('=====5')

except IndexError as e:
    print('IndexError:', e)
except KeyError as e:
    print('KeyError:', e)
# except Exception as e:
#     print('Exception:',e)
else:
    print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行')
finally:
    print('无论被检测的代码有没有异常都会执行')
    f.close()

(六)主动触发异常:

print('===>1')
print('===>2')
raise TypeError('类型错误')    #raise互动抛出异常
print('===>3')

class People:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def tell_info(self):
        print(self.__name,self.__age)

    def set_info(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

obj=People('egon',18)
# print(obj.__dict__)
# obj.tell_info()

obj.set_info('egon',123)
obj.tell_info()

(七) 自定义异常类型

class MyException(BaseException):
    def __init__(self,msg):
        super().__init__()
        self.msg=msg

    def __str__(self):
        return '<%s>' %self.msg

raise MyException('我自定义的异常')

(八)断言

print('上半部分,生产数据')
l=[1,2,3,4]

# if len(l) != 5:
#     raise TypeError('列表的长度必须为5')
assert len(l) == 5     

print('下半部分,处理数据')

猜你喜欢

转载自blog.csdn.net/qq_42737056/article/details/82118702