Как извлечь последнее сообщение из трассировки и сохранить исходную трассировку стека - PullRequest
0 голосов
/ 14 октября 2019

У меня есть скрипт на python, который использует try / исключением и вызывает другие функции. Я хотел бы использовать traceback для захвата трассировки стека, но также необходимо отделить последнее (или последнее) сообщение об ошибке в трассировке стека, чтобы итоговое сообщение могло быть четко отображено при возврате вызова API.

Ниже приведен пример функции. Есть несколько попыток / исключений, которые заключены в одну общую попытку за исключением. Вместо того, чтобы иметь так много возвратов, я хотел бы сжать сообщение трассировки из всех исключений и иметь только один оператор возврата.

Не уверены, возможно ли это?

def get(clean_event):

try:
    if clean_event["resource"] == "xxxxxxxxxxxx":
        try:
            study_id = clean_event["pathParameters"]["studyid"]
        except:
            message = "ERROR: unable to get study id from path parameter."
            return cb.return_to_caller(message=message,
                                       stack_trace=traceback.format_exc(),
                                       status_code=HTTP_STATUS_CODE.ERROR.value,
                                       cors=CORSVAR)

        try: 
            fx_name = "study.get_notes"
            fx_params = [None, study_id]

            return cb.common_get(clean_event['headers'],
                                 clean_event['queryStringParameters'],
                                 clean_event['pathParameters'], fx_name, fx_params
                                 )
        except:
            message = "ERROR: unable to execute function ({}) using study_id ({}).".format(
                fx_name, fx_params)

    elif clean_event["resource"] == "xxxxxxxxx":
        try:
            note_id = clean_event["pathParameters"]["noteid"]
        except:
            message = "ERROR: unable to get note id from path parameter."
            return cb.return_to_caller(message=message,
                                       stack_trace=traceback.format_exc(),
                                       status_code=HTTP_STATUS_CODE.ERROR.value,
                                       cors=CORSVAR)

        try: 
            fx_name = "study.get_notes"
            fx_params = [note_id, None]

            return cb.common_get(clean_event['headers'],
                                 clean_event['queryStringParameters'],
                                 clean_event['pathParameters'], fx_name, fx_params,
                                 strip_outer_array=True
                                 )
        except:
            message = "ERROR: unable to execute function ({}) using study_id ({}).".format(
                fx_name, fx_params)

    else:
        message = "ERROR: no logic exists for resource being invoked."
        return cb.return_to_caller(message=message,
                                   stack_trace=traceback.format_exc(),
                                   status_code=HTTP_STATUS_CODE.ERROR.value,
                                   cors=CORSVAR)

except:
    message = "ERROR: unable to execute GET. Check traceback for details."
    return cb.return_to_caller(message=message,
                               stack_trace=traceback.format_exc(),
                               status_code=HTTP_STATUS_CODE.ERROR.value,
                               cors=CORSVAR)

1 Ответ

0 голосов
/ 14 октября 2019

вы можете использовать traceback.format_exc ()

try:
 .
 .
except:
   stack_trace = traceback.format_exc().splitlines()
   print(stack_trace[0]) # first line in traceback
   print(stack_trace[-1]) # last line in the traceback
   # or to print everythoing
   print(stack_trace)

для получения полной информации обратитесь к документации модуля traceback.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...