python 异常处理, 打印系统报错原文,断言assert

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

异常包含三个部分:
  1. traceback异常的追踪信息
  2. 异常的类型
  3. 异常的信息

错误分为两大类:
  1. 语法上的错误:在程序运行前就应该立即修正
  2. 逻辑上的错误

2. 为何要异常处理

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

try:
    代码1
    代码2
    代码3
    ......
except NameError:
    当抛出的异常是NameError时执行的子代码块
except ....:
    pass
except ...:
    pass
else:
    pass
finally:
    pass
1.常见的逻辑错误导致的异常
print('adsfsadf'

age=input('>>: ').strip()
print(age > 10) #TypeError

for i in 10: #TypeError
    pass

import os
os.xxx #AttributeError

1 / 0 #ZeroDivisionError:

print('=====1')
print('=====2')
print('=====3')
l=[1,2,3]
l[1000] #IndexError
print('=====4')
d={'x':1,'y':2}
d['z'] #KeyError
print('=====5')
2. 异常处理
# 异常处理的单分支
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:
    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
    print('=====4')
    l = [1, 2, 3]
    l[1000]  # IndexError
    print('=====5')
except (KeyError,IndexError) as e:
    print(e)
print('other code')

# 万能异常类型Exception:可以匹配任意类型的异常
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('类型错误')
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('我自定义的异常')

打印系统报错原文 

import traceback

def test():
    try:
        int('dsadsa')
    except Exception as e:
        print(traceback.format_exc())   # 打印系统报错原文

    print('hello')

test()

'''
Traceback (most recent call last):
  File "D:/oldboy_edu/python_code/day100/py13client/test/s2.py", line 35, in test
    int('dsfsf')
ValueError: invalid literal for int() with base 10: 'dsfsf'

hello
'''

 断言

格式:

assert 条件,断言失败的自定义信息

断言条件通过,代码进行网下,断言条件失败,直接抛出异常(异常信息可以自定义)

a = 2
assert (a>1)
print('断言成功,程序继续向下执行')

b = 2
assert (b>=3),'b小于3'    # 报错 AssertionError: b小于3
print('断言失败,程序报错')
原文地址:https://www.cnblogs.com/ludingchao/p/12096181.html