Я создал свои собственные исключения как таковые в errors.py
mapper = {
'E101':
'There is no data at all for these constraints',
'E102':
'There is no data for these constraints in this market, try changing market',
'E103':
'There is no data for these constraints during these dates, try changing dates',
}
class DataException(Exception):
def __init__(self, code):
super().__init__()
self.msg = mapper[code]
def __str__(self):
return self.msg
Другая функция где-то еще в коде вызывает разные экземпляры DataException
, если в кадре данных pandas
недостаточно данных. Я хочу использовать unittest
, чтобы убедиться, что он возвращает соответствующее исключение с соответствующим сообщением.
На простом примере, почему это не работает:
from .. import DataException
def foobar():
raise DataException('E101')
import unittest
with unittest.TestCase.assertRaises(DataException):
foobar()
Как предлагается здесь: Python assertRaises для пользовательских исключений
Я получаю эту ошибку:
TypeError: assertRaises() missing 1 required positional argument: 'expected_exception'
Или альтернативно:
def foobar():
raise DataException('E101')
import unittest
unittest.TestCase.assertRaises(DataException, foobar)
приводит к:
TypeError: assertRaises() arg 1 must be an exception type or tuple of exception types
Почему он не распознает DataException
как Exception
? Почему связанный ответ на вопрос stackoverflow работает без указания второго аргумента assertRaises
?
DataException
кажется более питоническим, чем просто обертывание экземпляров вокругmapper.get
. См. различные подклассыOSError
в Python 3, которые ранее разные экземплярыOSError
, отличающиеся своими атрибутамиerrno
. - person chepner   schedule 19.03.2018