TelenkovDmitry 6 kuukautta sitten
vanhempi
commit
66800082e8

+ 195 - 0
courses/python_oop/exception/raise.py

@@ -0,0 +1,195 @@
+
+def raise_1():
+    try:
+        # {}['k'] # ошибка key error
+        [1, 2, 3][14] # ошибка index error
+    except (KeyError, IndexError) as error:
+        print(f'Logging error: {repr(error)}')
+        raise TypeError("raise TypeError!!!") from None
+    except ZeroDivisionError as err:
+        print('ZeroDevisionError')
+        print(f'Logging error: {err} {repr(err)}')
+        
+
+def raise_2():
+    a = TypeError("Ошибка типа")
+    print(a.args)
+    raise a
+
+def raise_3():
+    try:
+        raise ValueError('ошибка значения')
+    except ValueError as first:
+        try:
+            raise TypeError('ошибка типа')
+        except TypeError as second:
+            raise Exception('Большое исключение') from first
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+def function_1():
+    try:
+        x = 1/0
+        print('The end')
+    except ZeroDivisionError:
+        print("Can't divide by zero")
+        raise ValueError("Oops, something went wrong")
+    
+def function_2():
+    try:
+        function_1()
+    except ValueError as e:
+        print("ValueError cauth:", e)
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class Customer:
+
+    def __init__(self, name, balance=0):
+        self.name = name
+        self.balance= balance
+
+    @staticmethod
+    def check_type(value):
+        if not isinstance(value, (int, float)):
+            raise TypeError('Банк работает только с числами')
+
+    def withdraw(self, value):
+        Customer.check_type(value)
+        if self.balance < value:
+            raise ValueError('Сумма списания превышает баланс')
+        else:
+            self.balance -= value
+
+    def deposit(self, value):
+        Customer.check_type(value)
+        self.balance += value
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+def sum_numbers(numbers: list[int]):
+    if not isinstance(numbers, list):
+        raise TypeError("Аргумент numbers должен быть списком")
+    if not numbers:
+        raise ValueError("Пустой список")
+    for elem in numbers:
+        if not isinstance(elem, (int, float)):
+            raise TypeError('Неправильный тип элемента')
+    return sum(numbers)
+
+
+
+def main():
+
+    for value in (True, (1, 2, 3), {1: 'hello'}, {1, 2, 3}):
+        try:
+            result = sum_numbers(value)
+        except TypeError as error:
+            print(error)
+
+    try:
+        result = sum_numbers([])
+    except ValueError as error:
+        print(error)
+
+    try:
+        sum_numbers([1, 'hello', 2, 3])
+    except TypeError as error:
+        print(error)
+
+    try:
+        sum_numbers([1, 2, 3, 4, 5, [1, 2, 3]])
+    except TypeError as error:
+        print(error)
+
+    try:
+        sum_numbers([1, 2, 3, 4, 5, {1, 2, 3}])
+    except TypeError as error:
+        print(error)
+
+    try:
+        sum_numbers([1, 2, 3, 4, 5, (1, 2, 3)])
+    except TypeError as error:
+        print(error)
+
+    assert sum_numbers([1, 2, 3, 4, 5]) == 15
+    assert sum_numbers([1, 2, 3, 4, 5.0]) == 15.0
+
+
+    # raise_1()
+    # raise_2()
+    # raise_3()
+    # function_2()
+
+    # cus = Customer('user, 110')
+    # cus.check_type()
+
+    # my_list = [1, 2, 'asfadsf']
+    # empty_list = []
+
+    # sum_numbers(my_list)
+    # sum_numbers(empty_list)
+
+    '''
+    assert Customer.check_type(2) is None, 'Метод check_type не должен ничего возращать'
+    assert Customer.check_type(2.5) is None, 'Метод check_type не должен ничего возращать'
+
+    for i in ['hello', [1, 2, 3], dict(), set()]:
+        try:
+            Customer.check_type(i)
+        except TypeError as error:
+            print(error)
+        else:
+            raise TypeError(f'Метод check_type должен вызывать ошибку если передать {i}')
+
+    bob = Customer('Bob Odenkirk')
+    assert bob.balance == 0
+    assert bob.name == 'Bob Odenkirk'
+    try:
+        bob.deposit('hello')
+    except TypeError as error:
+        print(error)
+    else:
+        raise ValueError("Нельзя вносить на счет баланса строку")
+
+    try:
+        bob.deposit([])
+    except TypeError as error:
+        print(error)
+    else:
+        raise ValueError("Нельзя вносить на счет баланса список")
+
+    bob.deposit(200)
+    assert bob.balance == 200
+
+    try:
+        bob.withdraw(300)
+    except ValueError as e:
+        print(e)
+    else:
+        raise ValueError("Проверьте списание при превышении лимита")
+
+    bob.withdraw(150)
+    assert bob.balance == 50
+
+    terk = Customer('Terk', 1000)
+    assert terk.name == 'Terk'
+    assert terk.balance == 1000
+    terk.withdraw(999)
+    assert terk.balance == 1, 'Не списались деньги, проверяйте списание'
+    terk.withdraw(1)
+    assert terk.balance == 0, 'Не списались деньги, проверяйте списание'
+
+    try:
+        terk.withdraw(1)
+    except ValueError as e:
+        print(e)
+    else:
+        raise ValueError("Проверьте списание при превышении лимита")
+    assert terk.balance == 0
+    '''
+
+
+if __name__ == '__main__':
+    main()
+

+ 166 - 0
courses/python_oop/exception/user_exception.py

@@ -0,0 +1,166 @@
+
+class MyException(Exception):
+    """this is my excpetion"""
+    
+    def __init__(self, *args):
+        if args:
+            self.massage = args[0]
+        else:
+            self.message = None
+
+    def __str__(self):
+        print('str called')
+        if self.message:
+            return f"MyException {self.message}"
+        else:
+            return "MyException is empty"
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class SnakeExceptionBase(Exception):
+    """Основной класс ошибок змейки"""
+    pass
+
+class SnakeBorderException(SnakeExceptionBase):
+    """Ошибка соприкосновения змеи со стенкой"""
+    pass
+
+class SnakeTailException(SnakeBorderException):
+    """Соприкосновение змеи и тела"""
+    pass
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class UserNotFoundError(Exception):
+    pass
+
+users = {
+        "alice": {"name": "Alice Smith", "email": "alice@example.com"},
+        "bob": {"name": "Bob Johnson", "email": "bob@example.com"},
+        "jack": {"name": "Jack Wild", "email": "jack_wild@example.com"}
+    }
+
+def get_user(username):
+    if username not in users.keys():
+        raise UserNotFoundError("User not found")
+    return users[username]['name']
+
+def get_user_test():
+    try:
+        username = get_user('bob')
+    except UserNotFoundError as e:
+        print(e)
+    else:
+        print(username)
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class NegativeDepositError(Exception):
+    pass
+
+class InsufficientFundsError(Exception):
+    pass
+
+class BankAccount:
+
+    def __init__(self, balance):
+        self.balance = balance
+
+    def deposit(self, value):
+        if value < 0:
+            raise NegativeDepositError("Нельзя пополнить счет отрицательным значением")
+        self.balance += value
+        
+    def withdraw(self, value):
+        if value > self.balance:
+            raise InsufficientFundsError("Недостаточно средств для снятия")
+        self.balance -= value
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class PasswordInvalidError(Exception):
+    pass
+
+class PasswordLengthError(PasswordInvalidError):
+    pass
+
+class PasswordContainUpperError(PasswordInvalidError):
+    pass
+
+class PasswordContainDigitError(PasswordInvalidError):
+    pass
+
+
+class User:
+
+    def __init__(self, username, password=None):
+        self.username = username
+        self.password = password
+
+    def set_password(self, value):
+        up_str = ''
+        digit_str = ''
+
+        if len(value) < 8:
+            raise PasswordLengthError("Пароль должен быть не менее 8 символов")
+        
+        for sim in value:
+            if sim.isupper():
+                up_str += sim
+            if sim.isdigit():
+                digit_str += sim
+        if not up_str:
+            raise PasswordContainUpperError('Пароль должен содержать хотя бы одну заглавную букву')
+        if not digit_str:
+            raise PasswordContainDigitError('Пароль должен содержать хотя бы одну цифру')
+
+        self.password = value
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+def func_1():
+    # raise MyException('asdf', 1, 2, 3)
+    raise MyException()
+
+    # try:
+    #     raise MyException('asdf', 1, 2, 3)
+    # except MyException:
+    #     print('done')
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+def main():
+    # get_user_test()
+    # func_1()
+
+    assert issubclass(PasswordInvalidError, Exception)
+    assert issubclass(PasswordLengthError, PasswordInvalidError)
+    assert issubclass(PasswordContainUpperError, PasswordInvalidError)
+    assert issubclass(PasswordContainDigitError, PasswordInvalidError)   
+
+    user = User("johndoe")
+
+    try:
+        user.set_password("weakpwd")
+    except PasswordLengthError as e:
+        print(e)
+
+    try:
+        user.set_password("strongpassword8")
+    except PasswordContainUpperError as e:
+        print(e)
+
+    try:
+        user.set_password("Safepassword")
+    except PasswordContainDigitError as e:
+        print(e)
+
+    user.set_password("SecurePass123")
+    assert user.password == 'SecurePass123'
+
+
+
+if __name__ == "__main__":
+    main()