Как записать исключения в файл, не прерывая выполнение скрипта Python? - PullRequest
0 голосов
/ 07 июля 2019

Я анализирую CSV-файл, содержащий миллионы строк. Например.

id, item_id,..,..,..
40638242,896898,..,42,...
40638242,896898,..,42,..

Я использую в своем скрипте функциональность другого SDK, проблема в том, что мой скрипт выходит из строя из-за исключений, вызванных функциями SDK. Я не знаю об этих исключениях, и поэтому не могу обработать их до того, как мой сценарий потерпит неудачу!

Итак, чтобы обойти эту проблему, я использовал функцию регистрации Python для регистрации этих ошибок, а также создал отдельный CSV-файл для захвата 'id', 'item_id' и другой информации вместе с ошибкой, возникшей, как в столбце этого файла CSV. Мой код:

with open(prefix + 'cv2_error.csv', 'w+') as cv2_error_w, \
     open(prefix + 'ff_err.csv', 'w+') as ff_w:
    ff_err = csv.writer(ff_w, delimiter=',')

    for row in csv_reader:
        ca = row[3]  # age
        try:
            img = cv2.imread(path, 1)
        except cv2.error as cv_err:
            cv2_err_capture.writerow([row[0], row[1], path, cv_err])
            continue

        try:
            bb, pts, cp = frr.ff(...)
        except Exception:
            logger.exception("Issue with ff_err ")
            ff_err.writerow([row[0], row[1], path, Exception])
            continue
        ...
    ...
...

Теперь мой скрипт никогда не выходит из строя! Он продолжает показывать ошибки! такие как:

base_module.py:67: UserWarning: Data provided by label_shapes don't match names specified by label_names ([] vs. ['mae_label'])
  warnings.warn(msg)
Traceback (most recent call last):

ValueError: negative dimensions are not allowed

или

ValueError: could not broadcast input array from shape (0,423,3) into shape (354,423,3)

или

cv2.error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/resize.cpp:4044: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

Но мне не хватает исключений, которые будут записаны в моих файлах fff.csv и cv2_error.csv! так как я вижу, как работает другая функциональность, но эти 2 скрипта ничего не напечатали. Любые предложения о том, что я делаю не так?

1 Ответ

1 голос
/ 07 июля 2019

Вы должны захватить экземпляр исключения (as e) и преобразовать его в строку (str(e)):

try:
    bb, pts, cp = frr.ff(...)
except Exception as e:
    logger.exception("Issue with ff_err: " + str(e))
    ff_err.writerow([row[0], row[1], path, str(e))
    continue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...