如何处理python中的一些异常

2024-04-24 20:44:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些关于引发异常的知识,请尝试捕捉。但我不清楚如何正确处理这些错误

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

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'])
        return  #question: what should I do here
    else:
        return response['Item']

def handler (test):
    table_name = test["table_name"]
    if table_name not in ["test1", "test2"]:
        raise ValueError('table_name is not correct')

    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))
            return # question: what should I do here

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

如您所见,有时try-except在被调用的函数中(如dyndmodb_get_item),有时try-except在调用函数(handler)中

如果有例外。我要lambda下车/停车。那么我应该直接从被调用函数中退出,还是应该在被调用函数中返回某个内容,在调用函数中捕捉它,然后让调用函数退出

此外,我发现如果我使用一些内置异常,比如ValueError,我甚至不需要用try包装ValueError。等。如果值错误,则函数退出。我认为它很整洁。但是这个链接 Manually raising (throwing) an exception in Python 将ValueError放入try except。有人知道仅仅调用ValueError就足够了,还是应该用try-except来包装它


Tags: 函数namegetreturnresponsedefcreatetable
1条回答
网友
1楼 · 发布于 2024-04-24 20:44:46

如果您可以处理异常,那么您应该捕获它,进行必要的修改,然后返回到您正在执行的操作。如果您的方法无法处理该异常,则应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, ...)

相关问题 更多 >