попробуй кроме как не зацепиться за функцию? - PullRequest
2 голосов
/ 12 апреля 2019

Я получаю эту допустимую ошибку при предварительной обработке некоторых данных:

 9:46:56.323 PM default_model Function execution took 6008 ms, finished with status: 'crash'
 9:46:56.322 PM default_model Traceback (most recent call last):
  File "/user_code/main.py", line 31, in default_model
    train, endog, exog, _, _, rawDf = preprocess(ledger, apps)
  File "/user_code/Wrangling.py", line 73, in preprocess
    raise InsufficientTimespanError(args=(appDf, locDf))

Это происходит здесь:

async def default_model(request):
    request_json = request.get_json()
    if not request_json:
        return '{"error": "empty body." }'
    if 'transaction_id' in request_json:
        transaction_id = request_json['transaction_id']

        apps = []  # array of apps whose predictions we want, or uempty for all
        if 'apps' in request_json:
            apps = request_json['apps']

        modelUrl = None
        if 'files' in request_json:
            try:
                files = request_json['files']
                modelUrl = getModelFromFiles(files)
            except:
                return package(transaction_id, error="no model to execute")
        else:
            return package(transaction_id, error="no model to execute")

        if 'ledger' in request_json:
            ledger = request_json['ledger']

            try:
                train, endog, exog, _, _, rawDf = preprocess(ledger, apps)
            # ...
            except InsufficientTimespanError as err:
                return package(transaction_id, error=err.message, appDf=err.args[0], locDf=err.args[1])

И препроцесс правильно выдает мою пользовательскую ошибку:

def preprocess(ledger, apps=[]):
    """
    convert ledger from the server, which comes in as an array of csv entries.
    normalize/resample timeseries, returning dataframes
    """
    appDf, locDf = splitLedger(ledger)

    if len(appDf) < 3 or len(locDf) < 3:
        raise InsufficientDataError(args=(appDf, locDf))

    endog = appDf['app_id'].unique().tolist()
    exog = locDf['location_id'].unique().tolist()

    rawDf = normalize(appDf, locDf)
    trainDf = cutoff(rawDf.copy(), apps)
    rawDf = cutoff(rawDf.copy(), apps, trim=False)

    # TODO - uncomment when on realish data
    if len(trainDf) < 2 * WEEKS:
        raise InsufficientTimespanError(args=(appDf, locDf))

Дело в том, что он находится в блоке try``except именно потому, что я хочу перехватить ошибку и вернуть полезную нагрузку с ошибкой, а не сбой с ошибкой 500.Но все равно происходит сбой при моей пользовательской ошибке в блоке try.Прямо на этой линии звоните preprocess.

Это, должно быть, сбой с моей стороны, чтобы соответствовать коду Python.Но я не уверен, что я делаю неправильно.Среда Python 3.7

Вот где эта ошибка определена, в Wrangling.py:

class WranglingError(Exception):
    """Base class for other exceptions"""
    pass


class InsufficientDataError(WranglingError):
    """insufficient data to make a prediction"""

    def __init__(self, message='insufficient data to make a prediction', args=None):
        super().__init__(message)
        self.message = message
        self.args = args


class InsufficientTimespanError(WranglingError):
    """insufficient timespan to make a prediction"""

    def __init__(self, message='insufficient timespan to make a prediction', args=None):
        super().__init__(message)
        self.message = message
        self.args = args

А вот как main.py объявляет (импортирует) ее:

from Wrangling import preprocess, InsufficientDataError, InsufficientTimespanError, DataNotNormal, InappropriateValueToPredict

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Ваша preprocess функция объявлена ​​async.Это означает, что код на самом деле выполняется не там, где вы вызываете preprocess, а вместо этого, когда он в конечном итоге await редактируется или передается в основной цикл (например, asyncio.run).Поскольку место, где он запускается, больше не находится в блоке try в default_model, исключение не перехватывается.

Это можно исправить несколькими способами:

  • сделать preprocess не асинхронным
  • сделать также default_model асинхронным и await на preprocess.
1 голос
/ 18 апреля 2019

Соответствуют ли номера строк в ошибке номерам строк в вашем коде? Если нет, то возможно ли, что вы увидели ошибку в версии кода до того, как добавили попытку ... кроме?

...