异常

异常

主动抛出异常

没有错误,执行代码,有错误,执行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')
posted @ 2023-03-26 18:27  星空看海  阅读(35)  评论(0编辑  收藏  举报