【问题标题】:How to catch an Exception thrown by Azure Table in Python Azure Function如何在 Python Azure 函数中捕获 Azure 表引发的异常
【发布时间】:2021-01-08 02:54:42
【问题描述】:

问题

我有一个用 Python 3.8 编写的 Azure Function HTTP 触发函数。此函数接收传入的 HTTP 请求并将实体写入 Azure 表。如果传入请求尝试创建重复条目,Azure Table 会向 Azure Function 运行器抛出 EntityAlreadyExists 错误。我想捕获这个异常并相应地处理它。

我可以在 Python 中使用 Azure 函数中的一个 try/except 块来捕获这个异常吗?如果是这样,怎么做?如果没有,你知道为什么吗?

我尝试过的事情

  • try 运行代码,然后except ValueError as err: 处理异常
  • try 运行代码,然后except Exception as err: 处理异常
  • try 运行代码,然后except EntityAlreadyExists as err: 处理异常

这些都没有成功捕获从 Azure Table 引发的重复输入尝试的异常。

链接

抛出错误

这是我试图从 HTTP 触发的 Azure 函数中捕获的错误

Executed 'Functions.myTable' (Failed, Id=xxx-xxx-xxx-xxx, Duration=1256ms)
System.Private.CoreLib: Exception while executing function: Functions.myTable. Microsoft.Azure.WebJobs.Host: Error while handling parameter _binder after function returned:. Microsoft.Azure.WebJobs.Extensions.Storage: The specified entity already exists.
RequestId:xxx-xxx-xxx-xxx
Time:2020-09-30T13:16:00.9339049Z (HTTP status code 409: EntityAlreadyExists. The specified entity already exists.
RequestId:xxx-xxx-xxx-xxx
Time:2020-09-30T13:16:00.9339049Z). Microsoft.WindowsAzure.Storage: The specified entity already exists.
RequestId:xxx-xxx-xxx-xxx
Time:2020-09-30T13:16:00.9339049Z.

--init--.py

以下是 Azure 函数的 py 文件的相关部分。问题围绕第 16-27 行中的 try/except 块(未显示行号)。

import logging
import json
import azure.functions as func

def main(req: func.HttpRequest, myTable: func.Out[str]) -> func.HttpResponse:

    body = req.get_json()

    data = { # Data to send to Azure Table
        "PartitionKey": body.get('var1'),
        "RowKey": body.get('var2'),
        "Property1" : body.get('var3'),
        "Property2" : body.get('var4')
    }

    try: # Try to send record to Azure Table

        myTable.set(json.dumps(data))

    except ValueError as err: # Respond with 409 if duplicate record

        logging.error(err)

        return func.HttpResponse(
            body=f'Record already exists.',
            status_code=409
        )

    else: # Otherwise, respond with 201 success

        return func.HttpResponse(
                body=f'Success.',
                status_code=201
            )

函数.json

以下是 Azure 函数的触发器和绑定 json。

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ]
    },
    {
      "name": "myTable",
      "type": "table",
      "tableName": "myTable",
      "connection": "AzureWebJobsStorage",
      "direction": "out"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

【问题讨论】:

  • 你能用你的天蓝色函数的相关部分更新问题吗?
  • @AbdulNiyasPM,很好的建议!我希望我没有把这个问题提得太久。我添加了 py 文件和绑定/触发器 json 的相关部分。
  • 什么是type(myTable)
  • @AbdulNiyasPM,这是微软调用的一个类。它在他们的 azure.functions 包中定义。他们在这里有更多关于 Out 类的文档:docs.microsoft.com/en-us/python/api/azure-functions/…
  • 更多关于使用 Out 类在 Azure Table 中创建实体(记录)的文档:docs.microsoft.com/en-us/azure/azure-functions/…

标签: python exception azure-functions azure-table-storage


【解决方案1】:

Azure 表存储在预览版中有一个新的 Python 库,可通过 pip 进行安装。要安装使用以下 pip 命令

pip install azure-data-tables

在 Azure Functions 中,您可以使用 try/except 块来捕获由 Tables 响应引发的异常。从 Azure Functions 访问您的表帐户的推荐方法是通过启用 MSI 的 KeyVault 客户端来检索您的凭据以对您的 TableClient 进行身份验证。尝试创建新表的示例函数如下所示:

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    from azure.identity import ManagedIdentityCredential
    from azure.keyvault.secrets import SecretClient

    credential = ManagedIdentityCredential()
    client = SecretClient("https://tablesfunctions.vault.azure.net", credential)
    conn_str = client.get_secret("tables-connstr")

    from azure.data.tables import TableClient
    from azure.core.exceptions import ResourceExistsError

    table_client = TableClient.from_connection_string(conn_str, table_name="MyTableName")
    try:
        table_client.create_table()
    except ResourceExistsError:
        return func.HttpResponse("Table already exists")

(仅供参考,我在 Azure SDK for Python 团队工作。)

【讨论】:

  • 笨蛋!谢谢!
【解决方案2】:

如果您使用的是 python。 Python只能使用声明式绑定方式,而不能使用命令式绑定方式,所以如果要使用绑定来实现,是不可能使用'try catch'的。

正确的做法是将逻辑放在函数的内容中,然后可以使用try catch。

【讨论】:

    猜你喜欢
    • 2019-07-17
    • 1970-01-01
    • 2022-01-02
    • 2022-01-21
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多