相关疑难解决方法(0)

Boto3,python以及如何处理错误

我只是选择python作为我的首选脚本语言,我试图找出如何使用boto3进行正确的错误处理.

我正在尝试创建一个IAM用户:

def create_user(username, iam_conn):
    try:
        user = iam_conn.create_user(UserName=username)
        return user
    except Exception as e:
        return e
Run Code Online (Sandbox Code Playgroud)

当对create_user的调用成功时,我得到一个整洁的对象,其中包含API调用的http状态代码和新创建的用户的数据.

例:

{'ResponseMetadata': 
      {'HTTPStatusCode': 200, 
       'RequestId': 'omitted'
      },
 u'User': {u'Arn': 'arn:aws:iam::omitted:user/omitted',
           u'CreateDate': datetime.datetime(2015, 10, 11, 17, 13, 5, 882000, tzinfo=tzutc()),
           u'Path': '/',
           u'UserId': 'omitted',
           u'UserName': 'omitted'
          }
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.但是当这个失败时(比如用户已经存在),我只得到一个类型为botocore.exceptions.ClientError的对象,只有文本告诉我出了什么问题.

示例:ClientError('调用CreateUser操作时发生错误(EntityAlreadyExists):名称已省略的用户已存在.',)

这个(AFAIK)非常难以处理错误,因为我不能只打开生成的http状态代码(根据IAM的AWS API文档,用户已经存在409).这让我觉得我必须以错误的方式做事.最佳方式是boto3永远不会抛出异常,但juts总是返回一个反映API调用方式的对象.

任何人都可以在这个问题上启发我或指出我正确的方向吗?

非常感谢!

python boto amazon-web-services boto3

171
推荐指数
5
解决办法
13万
查看次数

空检查链与捕获NullPointerException

Web服务返回一个巨大的XML,我需要访问它的深层嵌套字段.例如:

return wsObject.getFoo().getBar().getBaz().getInt()
Run Code Online (Sandbox Code Playgroud)

问题是getFoo(),getBar(),getBaz()可能所有的回报null.

但是,如果我null在所有情况下检查,代码将变得非常冗长且难以阅读.此外,我可能会错过某些领域的支票.

if (wsObject.getFoo() == null) return -1;
if (wsObject.getFoo().getBar() == null) return -1;
// maybe also do something with wsObject.getFoo().getBar()
if (wsObject.getFoo().getBar().getBaz() == null) return -1;
return wsObject.getFoo().getBar().getBaz().getInt();
Run Code Online (Sandbox Code Playgroud)

写作是否可以接受

try {
    return wsObject.getFoo().getBar().getBaz().getInt();
} catch (NullPointerException ignored) {
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

还是会被视为反模式?

java null exception nullpointerexception custom-error-handling

108
推荐指数
4
解决办法
1万
查看次数

抛出RuntimeException的方法是否应该在方法签名中指明它?

例如,框架/ JDK中的许多方法可能会抛出

java.lang.SecurityException 
Run Code Online (Sandbox Code Playgroud)

但是这没有在方法签名中指出(因为这是通常为已检查的异常保留的做法).我想说,在方法sigs中声明RuntimeExceptions有许多好处(例如类似于静态类型检查).我喝醉了还是其他的?

java oop exception-handling exception

74
推荐指数
4
解决办法
3万
查看次数

何时可以捕获RuntimeException

在最近的一个项目中,我建议在测试工具代码中捕获RuntimeException并记录它.代码处理来自数据库的一系列输入,我不希望测试因任何一个输入失败而停止(Null值,Illegal arguments等).不用说,我的建议引发了激烈的讨论.

捕获任何类型的RuntimeException都可以接受吗?如果是,那么可以捕获RuntimeExceptions的其他方案是什么?

java exception-handling

65
推荐指数
6
解决办法
6万
查看次数

close是否会抛出IOException?

在这里提供了一些答案并阅读了一些注释后,似乎实际上IOException永远不会在文件I/O上关闭.

是否有任何情况下,在Stream/Reader/Writer上调用close实际上会抛出IOException?

如果实际抛出异常,应如何处理?

java ioexception

28
推荐指数
4
解决办法
9642
查看次数

哪个更好/更有效:检查错误值或捕获Java中的异常

哪个在Java中更有效:检查错误值以防止异常或让异常发生并捕获它们?

以下是两个示例代码块,用于说明这种差异:

void doSomething(type value1) {
    ResultType result = genericError;

     if (value1 == badvalue || value1 == badvalue2 || ...) {
          result = specificError;
     } else {
          DoSomeActionThatFailsIfValue1IsBad(value1);
          // ...
          result = success;
     }
     callback(result);
}
Run Code Online (Sandbox Code Playgroud)

void doSomething(type value1) {
     ResultType result = genericError;
     try {
          DoSomeActionThatFailsIfValue1IsBad(value1);
          // ...
          result = success;
     } catch (ExceptionType e) {
          result = specificError;
     } finally {
          callback(result);
     }
}
Run Code Online (Sandbox Code Playgroud)

一方面,你总是在进行比较.另一方面,老实说,我不知道系统的内部做什么来生成异常,抛出它,然后触发catch子句.它有效率较低的声音,但如果它不会在非错误情况下增加开销,那么它的平均效率会更高.这是什么?它是否会添加类似的检查?是否在为异常处理添加的隐式代码中检查,即使有额外的显式检查层?也许它总是取决于异常的类型?我不考虑什么?

让我们假设所有"坏值"都是已知的 - 这是一个明显的问题.如果您不知道所有错误的值 - 或者列表太长且不规则 - 那么异常处理可能是唯一的方法.

那么,每种方法的优缺点是什么?为什么?

需要考虑的问题:

  • 如果值在大多数情况下是"坏"(会抛出异常),你的答案会如何变化?
  • 这有多少取决于正在使用的VM的细节?
  • 如果要求语言-X提出同样的问题,答案会有所不同吗?(更一般地说,问题是否可以假设检查值总是比依赖异常处理更有效,因为它增加了当前编译器/解释器的开销.) …

java error-handling optimization performance exception

14
推荐指数
3
解决办法
2557
查看次数

我如何使用Google Guava的Throwables.propagateIfInstanceOf()?

javadoc示例

  try {
    someMethodThatCouldThrowAnything();
  } catch (IKnowWhatToDoWithThisException e) {
    handle(e);
  } catch (Throwable t) {
    Throwables.propagateIfInstanceOf(t, IOException.class);
    Throwables.propagateIfInstanceOf(t, SQLException.class);
    throw Throwables.propagate(t);
  }
Run Code Online (Sandbox Code Playgroud)

不是很具体.真正的程序会是什么样子?我真的不明白的方法的目的Throwables.propagateIfInstanceOf(Throwable, Class),propagate(),propagateIfPossible().我什么时候使用它们?

java guava

14
推荐指数
1
解决办法
4289
查看次数

声明方法是否会抛出未经检查的异常是否有优势?

如果我有一个抛出未经检查的异常的方法,例如:

void doSomething(int i) {
  if (i < 0) throw new IllegalArgumentException("Too small");
  // ...
}
Run Code Online (Sandbox Code Playgroud)

明确声明该方法抛出异常是否有任何好处,即

void doSomething(int i) throws IllegalArgumentException {
  if (i < 0) throw new IllegalArgumentException("Too small");
  // ...
}
Run Code Online (Sandbox Code Playgroud)

与(或除了)描述javadoc中的行为相反:

/**
 * This method does something useful.
 * @param i some input value
 * @throws IllegalArgumentException if {@code i < 0}
 */
void doSomething(int i) {
  if (i < 0) throw new IllegalArgumentException("Too small");
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我声称它的原因是没有用的throws是:

  • throws没有提供关于抛出异常的情况的信息,只提供可能抛出的异常;
  • 因为它是一个未经检查的异常,我不会被迫在调用代码时处理异常.我只会真的知道如果我去看看它的执行情况可能会被抛出 …

java exception unchecked-exception

12
推荐指数
2
解决办法
1160
查看次数

检查异常的优缺点是什么?

您是否更喜欢在Java中检查异常处理或在C#中未经检查的异常处理以及为什么?

c# java exception

11
推荐指数
5
解决办法
3044
查看次数

请解释Java中的RuntimeException以及它应该在何处使用

我在SO上进行了这个伟大的讨论,标题为:针对已检查异常的情况,但是我无法遵循应该使用RuntimeException的地方以及它与正常异常及其子类的不同之处.谷歌搜索给了我一个复杂的答案,也就是说,它应该用于处理编程逻辑错误,并且应该在没有正常情况发生时抛出,例如在switch-case结构的默认块中.

你能否在这里详细解释一下RuntimeException.谢谢.

java exception runtimeexception

10
推荐指数
2
解决办法
2万
查看次数