异常
异常
主动抛出异常
没有错误,执行代码,有错误,执行raise
sername = input('username:>>').strip()
password = input('password:>>').strip()
if username == 'kevin' and password == '123':
pass
else:
# print('用户名和密码错误')
# 抛异常
raise TypeError('用户名和密码错误')
'''
Traceback (most recent call last):
File "E:\python project\day28\03 异常.py", line 11, in <module>
raise TypeError('用户名和密码错误')
TypeError: 用户名和密码错误
'''
还记得之前学习的抽象类代码吗?
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def speak(self):
pass
抽象类可以使用主动抛出异常
'''父类限制子类的行为,源代码中会遇到'''
class Animal():
def speak(self):
raise Exception('必须实现speak方法')
class People(Animal):
def speak(self):
pass
obj1 = People()
obj1.speak() # People类有这个方法,直接执行People类的方法
class Dog(Animal):
def bar(self):
pass
obj2 = Dog()
obj2.speak() # Dog()类没有这个方法,就会去父类寻找这个方法,就会触发主动抛出异常
'''
Traceback (most recent call last):
File "E:\python project\day28\03 异常.py", line 25, in speak
raise Exception('必须实现speak方法')
Exception: 必须实现speak方法
'''
自定义异常类(了解)
在内置异常不够用的情况下,我们可以通过继承内置的异常类来自定义异常类
class MyException(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
raise MyException('用户名和密码错误')
'''
Traceback (most recent call last):
File "E:\python project\day28\03 异常.py", line 56, in <module>
raise MyException('用户名和密码错误')
__main__.MyException: 用户名和密码错误
'''
class PoolEmptyError(Exception): # 可以通过继承Exception来定义一个全新的异常
def __init__(self,value='The proxy source is exhausted'): # 可以定制初始化方法
super(PoolEmptyError,self).__init__()
self.value=value
def __str__(self): # 可以定义该方法用来定制触发异常时打印异常值的格式
return '< %s >' %self.value
class NetworkIOError(IOError): # 也可以在特定异常的基础上扩展一个相关的异常
pass
raise PoolEmptyError # __main__.PoolEmptyError: < The proxy source is exhausted >
raise NetworkIOError('连接被拒绝') # __main__.NetworkIOError: 连接被拒绝
断言
assert后面跟正确的条件
条件正确,下面的代码就能够运行,条件不正确,就会异常。使用时,
assert 1 == 1
print(123) # 123
assert 1 == 1 # 条件错误,就会报错,下面的代码不会执行
print(123)
具体使用:
d = {'username1':'kevin', 'age':20}
assert 'username' in d
print('21134243')