相关疑难解决方法(0)

针对已检查异常的案例

多年来,我一直无法得到以下问题的正确答案:为什么一些开发人员如此反对已检查的异常?我有很多对话,在博客上阅读,阅读Bruce Eckel所说的内容(我看到的第一个人反对他们).

我目前正在编写一些新代码,并非常注意我如何处理异常.我试图看到"我们不喜欢被检查的例外"人群的观点,我仍然看不到它.

每次谈话结束时,同样的问题都没有得到答复......让我把它设置起来:

一般来说(从Java的设计方式来看),

  • 对于永远不应该捕获的东西是错误的(VM有花生过敏而且有人丢了一罐花生)
  • RuntimeException用于程序员做错的事情(程序员走出数组的末尾)
  • 异常(RuntimeException除外)适用于程序员无法控制的内容(在写入文件系统时磁盘已填满,已达到进程的文件句柄限制,您无法再打开任何文件)
  • Throwable只是所有异常类型的父级.

我听到的一个常见论点是,如果发生异常,那么开发人员将要做的就是退出该程序.

我听到的另一个常见论点是,经过检查的异常会使重构代码变得更加困难.

对于"我将要做的就是退出"这个论点,我说即使你要退出,你也需要显示一个合理的错误信息.如果您只是在处理错误,那么当程序退出而没有明确说明原因时,您的用户将不会过于高兴.

对于"它很难重构"的人群,这表明没有选择适当的抽象级别.而不是声明方法抛出IOException,IOException应该转换为更适合正在发生的事件的异常.

我没有使用catch(Exception)包装Main的问题(或者在某些情况下catch(Throwable)以确保程序可以正常退出 - 但我总是捕获我需要的特定异常.这样做允许我,至少,显示适当的错误消息.

人们从不回复的问题是:

如果你抛出RuntimeException子类而不是Exception子类,那么你怎么知道你应该捕获什么?

如果答案是捕获异常,那么您也会以与系统异常相同的方式处理程序员错误.这对我来说似乎不对.

如果您捕获Throwable,那么您将以相同的方式处理系统异常和VM错误(等).这对我来说似乎不对.

如果答案是你只捕获你知道的异常,那么你怎么知道抛出的是什么?当程序员X抛出一个新的异常并忘记捕获它时会发生什么?这对我来说似乎非常危险.

我会说显示堆栈跟踪的程序是错误的.那些不喜欢检查异常的人是不是觉得那样?

那么,如果您不喜欢已检查的异常,您可以解释为什么不能并且回答那些无法解答的问题吗?

编辑:我不是在寻找何时使用任何一个模型的建议,我正在寻找的是为什么人们从RuntimeException扩展,因为他们不喜欢从Exception扩展和/或为什么他们捕获异常然后重新抛出RuntimeException而不是将抛出添加到他们的方法中.我想了解不喜欢检查异常的动机.

java exception checked-exceptions

437
推荐指数
21
解决办法
5万
查看次数

正确捕获boto3错误

我正在开发一个django应用程序,它与几个Amazon Web Services进行通信.

到目前为止,我无法处理和捕获boto3客户端抛出的异常.我正在做的事似乎不必要地单调乏味:

例:

client = boto3.client('sns')
client.create_platform_endpoint(PlatformApplicationArn=SNS_APP_ARN, Token=token)
Run Code Online (Sandbox Code Playgroud)

这可能会抛出一个botocore.errorfactory.InvalidParameterExceptionif例如令牌是坏的.

client.get_endpoint_attributes(EndpointArn=endpoint_arn)
Run Code Online (Sandbox Code Playgroud)

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

首先,我无法在代码中的任何地方找到这些错误,因此它们可能在某处生成.底线:我不能像往常一样导入它并抓住它.

第二,我发现了一个办法赶上错误在这里使用:

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

但我必须删除Exception错误名称的一部分.似乎非常随机,我不知道如果我想抓住那个,我是否会删除Errorin botocore.exceptions.ParamValidationError.所以很难概括.

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

try:
    # boto3 stuff
except client.exceptions.NotFoundException as e:
    # handle exception
Run Code Online (Sandbox Code Playgroud)

这似乎是迄今为止最干净的方式.但我并不总是手头有boto3客户端对象,我想抓住错误.此外,我仍然只是在尝试,所以它主要是猜测工作.

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

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

django exception amazon-web-services boto3

15
推荐指数
2
解决办法
8555
查看次数

如何导入boto3 ssm ParameterNotFound异常?

我想importexception是,当发生boto3 ssm不与发现的参数get_parameter.我正在尝试为库添加一些额外的ssm功能moto,但我在这一点上很难过.

>>> import boto3
>>> ssm = boto3.client('ssm')
>>> try:
        ssm.get_parameter(Name='not_found')
    except Exception as e:
        print(type(e))
<class 'botocore.errorfactory.ParameterNotFound'>
>>> from botocore.errorfactory import ParameterNotFound
ImportError: cannot import name 'ParameterNotFound'
>>> import botocore.errorfactory.ParameterNotFound
ModuleNotFoundError: No module named 'botocore.errorfactory.ParameterNotFound'; 'botocore.errorfactory' is not a package
Run Code Online (Sandbox Code Playgroud)

但是,Exception无法导入,并且似乎不存在于botocore代码中.如何导入此例外?

python amazon-web-services botocore boto3 moto

14
推荐指数
2
解决办法
3482
查看次数

SSM 的 Boto3 AWS API 错误响应

我正在使用一个简单的 boto3 脚本从我的 aws 帐户中的 SSM 参数存储中检索参数。python 脚本如下所示:

client = get_boto3_client('ssm', 'us-east-1')
try:
    response = client.get_parameter(Name='my_param_name',WithDecryption=True)
except Exception as e:
    logging.error("retrieve param error: {0}".format(e))
    raise e
return response
Run Code Online (Sandbox Code Playgroud)

如果给定的参数不可用,我会在响应中收到一个通用错误,如下所示:

 An error occurred (ParameterNotFound) when calling the GetParameter operation: Parameter my_param_name not found.   
Run Code Online (Sandbox Code Playgroud)

我已经验证了boto3 ssm docs 的方法签名。相关的AWS API 文档确认在参数存储中不存在参数时返回 400 响应。

我的问题是如何验证响应中捕获的异常是否实际上是 400 状态代码,以便我可以相应地处理它。

python amazon-web-services boto3 aws-ssm

5
推荐指数
1
解决办法
6246
查看次数