【发布时间】: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 引发的重复输入尝试的异常。
链接
- c# 的相关问题:How to catch an Exception throw by Azure Table in an async Azure Function HTTP Triggered function。
- 表服务错误代码:https://docs.microsoft.com/en-us/rest/api/storageservices/table-service-error-codes
抛出错误
这是我试图从 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