kubernetes 在Python中,except块在try except中不工作

8aqjt8rx  于 2023-06-28  发布在  Kubernetes
关注(0)|答案(1)|浏览(77)

我试图从AWS lambda(python)中的特定命名空间获取pod列表。
它给出了正确的和预期的pod列表。但是当我传递错误的命名空间时,它不会跳过try块,也不会捕获except块以返回正确的响应。有什么原因吗?

import json
from kubernetes.client.rest import ApiException

def get_pods(namespace: str, apiCoreclient: object):

    response_output = {}
    response_output["statusCode"] = 200    

    retList = []
    items = apiCoreclient.list_namespaced_pod(namespace).items
    for item in items:
        try:
            retList.append(item.metadata.name)
            response_output['Pods'] = json.dumps({"Pods": retList})

        except ApiException as e:
            response_output["error"] = e.reason
            response_output["statusCode"] = e.status

    response_output["isBase64Encoded"] = "False"       
    return json.dumps(response_output)
x0fgdtte

x0fgdtte1#

这个问题似乎与try/except错误处理的位置有关。在当前的代码中,您已经将try/except放在了遍历每一项的循环中。这意味着它只在您将pod名称添加到retList或在response_output中设置'Pods'字段时捕获错误。
但是当您尝试使用apiCoreclient.list_namespaced_pod(namespace)列出名称空间中的pod时,可能会出现您预期的错误-ApiException。这一行在try/except块之外,所以如果ApiException发生在那里,错误处理不会捕捉到它。
要解决这个问题,您应该移动try/except块以包含apiCoreclient.list_namespaced_pod(namespace)行。下面是函数的一个调整版本来说明这一点:

def get_pods(namespace: str, apiCoreclient: object):
    response_output = {}
    response_output["statusCode"] = 200    
    retList = []

    try:
        items = apiCoreclient.list_namespaced_pod(namespace).items
        for item in items:
            retList.append(item.metadata.name)
        response_output['Pods'] = json.dumps({"Pods": retList})

    except ApiException as e:
        response_output["error"] = e.reason
        response_output["statusCode"] = e.status

    response_output["isBase64Encoded"] = "False"       
    return json.dumps(response_output)

在这个改进的版本中,如果在尝试列出命名空间中的pod时出现ApiException,它将被捕获并创建正确的错误响应。

相关问题