如何处理python中的错误

时间:2018-08-14 19:17:32

标签: python amazon-web-services aws-lambda

我对引发异常,尝试捕捉有一些了解。但我不清楚如何正确处理这些错误。

例如我在AWS lambda服务中创建了一些dymanodb函数:

0:
#<Model1 id: 29, attribute_1: 'test_value_1', attribute_2: 'test_value_2', created_at: "2018-08-15 03:55:08", updated_at: "2018-08-15 04:05:01">
1:
<ActionController::Parameters {"name"=>"test_name", "attribute_1"=>nil, "attribute_2"=>nil} permitted: true>
3:
#<Model2 id: nil, name: 'test_name', attribute_1: nil, attribute_2: nil, created_at: nil, updated_at: nil>

如您所见,try-except有时出现在被调用函数中(例如dyndmodb_get_item),try-except有时出现在调用函数中(处理程序)。

如果有除外。我想要lambda出口/停止。那么我应该直接退出被调用函数,还是应该返回sth。在被调用函数中,将其捕获在调用函数中,然后让调用函数退出?

此外,我发现如果我使用一些内置异常(例如ValueError),则什至无需尝试包裹ValueError。等等。如果值错误,则函数退出。我认为这很整洁。但是这个链接 Manually raising (throwing) an exception in Python 将ValueError放入try-except中。有人知道仅调用ValueError是否足够,还是应该将其包装在try-except中?

1 个答案:

答案 0 :(得分:3)

如果可以处理异常,则应捕获该异常,进行必要的修改,然后返回正在执行的操作。如果您的方法无法处理该异常,则应raise将该异常传递给调用方。然后,在正在运行的实例的最顶层调用方法中,如果异常实际上是致命的,则应打印跟踪或错误消息。

def dynamodb_create_table (table_name, ...):
    table = dynamodb.create_table (...)
    table.wait_until_exists()
    return table

def dyndmodb_get_item (table, ...):
    try:
        response = table.get_item(...)
    except ClientError as e:
        logger.error (e.response['Error']['Message'])
        raise
    else:
        return response['Item']

def handler (test):
    dynamodb = boto3.resource('dynamodb')
    try:
        response = boto3.client('dynamodb').describe_table(...)
    except ClientError as ce:
        if ce.response['Error']['Code'] == 'ResourceNotFoundException':
        logger.info("table not exists, so Create table")
        ddb_create_table (table_name, partition_key, partition_key_type)
    else:
        logger.error("Unknown exception occurred while querying for the " + table_name + " table. Printing full error:" + str(ce.response))
        raise

 table = dynamodb.Table(table_name)
 ...
 response = ddb_put_item (table,...)
 item = ddb_get_item (table, ...)