代码之家  ›  专栏  ›  技术社区  ›  user389955

如何在python中处理错误

  •  1
  • user389955  · 技术社区  · 6 年前

    我对提出异常有一定的了解,试着抓住。但我不清楚如何正确处理这些错误。

    e、 g.我在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)中。

    如果有例外的话。我要拉姆达退出。然后,我应该直接退出被叫函数,还是应该在调用函数中返回某个函数,在调用函数中捕获它,然后让调用函数退出?

    另外,我发现如果我使用一些内置异常,比如ValueError,我甚至不需要用try包装ValueError。如果值是错误的,函数退出。我觉得很整洁。但是这个环节 Manually raising (throwing) an exception in Python 尝试将ValueError放入except。有人知道仅仅调用ValueError是否足够,或者我应该将它包装成try-except吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   J. Blackadar    6 年前

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