当前位置: 首页 > 知识库问答 >
问题:

正确捕捉错误

司徒云
2023-03-14

我正在开发一个django应用程序,它可以与几个Amazon Web服务进行通信。

到目前为止,我在处理和捕获boto3客户端抛出的异常方面遇到了困难。我正在做的事情似乎不必要地单调乏味:

例子:

client = boto3.client('sns')
client.create_platform_endpoint(PlatformApplicationArn=SNS_APP_ARN, Token=token)

如果令牌坏了,这可能会抛出一个botocore.errorfactory.InvalidParameterExc0019

client.get_endpoint_attributes(EndpointArn=endpoint_arn)

可能会抛出一个botocore.errorfactory.NotFoundException

首先,我在代码中的任何地方都找不到这些错误,所以它们可能是在某个地方生成的。一句话:我不能像往常一样导入和捕获它。

其次,我发现了一种方法来捕获错误这里使用:

try:
    # boto3 stuff
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == 'NotFound':
        # handle exception
    else:
        raise e

但是我必须删除错误名称的异常部分。看起来非常随机,我不知道是否要删除botocore.exceptions.ParamValidationError中的错误,如果我想捕获该错误的话。所以很难一概而论。

另一种捕获错误的方法是使用我得到的boto3客户端对象:

try:
    # boto3 stuff
except client.exceptions.NotFoundException as e:
    # handle exception

这似乎是迄今为止最干净的方式。但我并不总是手头有boto3客户机对象,我想在那里捕捉错误。而且我还只是在尝试,所以大部分都是猜测。

有人知道boto3错误应该如何处理吗?

或者可以给我指出一些提到上述错误的连贯文档?谢谢


共有2个答案

秦城
2023-03-14

使用以下例外情况:https://www.programcreek.com/python/example/97944/boto3.exceptions

client = boto3.client('logs')
try:
   client.create_log_group(logGroupName=LOG_GROUP)
except client.exceptions.ResourceAlreadyExistsException:
   pass
董高洁
2023-03-14

你很好地概括了形势。旧的boto有一个简单的硬编码方法来支持AWSAPIboto3,似乎是为了减少Python客户端与各种API上不断发展的功能保持同步的开销,在异常情况下更为谨慎,因此您上面概述的ClientError方法曾经是规范的方法。

2017年,他们引入了您强调的第二种机制:客户机上可用的“建模”异常。

我不熟悉SNS,但根据我对其他AWS产品的经验,ClientError命名与HTTP API相匹配,后者往往有很好的文档记录。所以我从这里开始:https://docs.aws.amazon.com/sns/latest/api/Welcome.html

看起来新样式的建模异常是从位于botocore模块中的服务定义文件生成的。我找不到任何关于它的文档,但可以在中浏览AWS服务模型https://github.com/boto/botocore/tree/master/botocore/data.

另外,如果您不是(与OP的代码相反)直接处理低级客户端,而是使用高级AWSServiceResource对象,那么低级客户端仍然可以在my_service\u resource.meta.client轻松访问,因此您可以处理如下异常:

try:
    my_service_resource.do_stuff()
except my_service_resource.meta.client.exceptions.NotFoundException as e:
    # handle exception
 类似资料:
  • 我在用滑翔4。当URL返回404时,获取FileNotFoundException。我尝试使用RequestListener捕捉异常。但它并没有缓存这个异常。 记录如下: 2019-03-20 17:48:07.134 32233-32233/com。zyta。zflikz带滑翔:装载失败https://lh4.googleusercontent.com/-UxjwFuQRjXA/AAAAAAAA

  • 问题内容: 我听说捕捞被认为是不好的作法。我当前正在加载一个不能保证在PATH上的.dll,并希望在不存在的情况下切换到用户配置的位置。 有更好的方法吗?还是在这里接受是可以接受的? 问题答案: 除了提供有关如何从技术上解决问题的建议以外,我想花点时间解释一下为什么它首先被认为是“不好的做法”。 让我们从澄清什么是类开始。 在Java中,将引发错误和异常(它们是主要类型)。通过使用关键字可以完成上

  • 我定义了一个自定义错误处理程序,它捕获所有异常并将其保存到日志中。现在,如果我在mysqli查询中出现语法错误,例如打字错误,页面将完全停止加载。没有引发异常,因此不会触发错误处理程序,也不会记录任何内容。 这正常吗?我是否应该检查PHP设置来修复此问题,以便任何mysqli查询错误都会引发异常? (如果查询返回0个结果,我不希望引发异常-仅当它由于键入错误或查询结构中的其他错误而出错时) 查询示

  • 在节点中。在js服务器上,捕获SIGTERM和捕获SIGINT有什么区别吗? 我认为进程不应该能够防止SIGINT关闭? 我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但从我所读到的内容来看,SIGINT总是假设关闭一个进程。 或者我把SIGINT和SIGKILL混淆了?也许SIGKILL是我无法恢复的信号? 捕捉这些信号当然可以让我优雅地关机: 我想我把SIGINT和SIGKILL

  • 我的数据服务如下所示: 如果我得到一个HTTP错误(即404),我会从core得到一条令人讨厌的控制台消息:error error:Uncaught(promise):[object]。es5。在我的情况下,我该如何处理?

  • 问题内容: 在Java中是否有捕捉到内存不足错误()的问题? 问题答案: 是的 。以下是一些可能有意义的示例: 如果您想通过 优雅地关闭 程序来处理它 如果要向用户显示问题或 记录错误 根据您的设计,您甚至可以清理内存并 恢复工作状态 但是 ,请注意,通常情况下(除非您处在一次要分配大量内存的位置),对于这些情况,您可能不会专门捕获OutOfMemoryError,而是始终在顶部进行操作主要入口点