当抛出未捕获的异常时,任何Amazon AWS Lambda Java函数需要不合理的长时间才能完成,这正常吗?请注意,这是一个关于Java中Amazon Lambdas的一般性问题,因为我正在以一种非常通用的方式测试这个问题,使用一个非常简单的bare bones函数。
例如,考虑下面的函数,它验证PIN。如果PIN有效,则返回文本:PIN is ok:“a”
。否则,将抛出IOException
:
public class Hello implements RequestStreamHandler {
private static final int BUFFER_SIZE = 65_536;
private static final int MAX_SIZE = 262_144;
private static final String CHARSET_UTF8 = "UTF-8";
private static final byte[] buffer = new byte[BUFFER_SIZE];
private static final ByteArrayOutputStream baos = new ByteArrayOutputStream();
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
String input = readInputStreamToString(inputStream);
// PIN is valid.
if (input.equals("\"A\""))
writeStringToOutputStream(outputStream, "PIN is OK: " + input);
// PIN is not valid.
else
throw new IOException("PIN is wrong: " + input);
}
private String readInputStreamToString(InputStream inputStream) throws IOException {
baos.reset();
int length, total = 0;
while ((length = inputStream.read(buffer)) != -1) {
total += length;
if (total > MAX_SIZE) throw new IllegalStateException("InputStream bigger than " + MAX_SIZE + ".");
baos.write(buffer, 0, length);
}
return baos.toString(CHARSET_UTF8);
}
private void writeStringToOutputStream(OutputStream outputStream, String info) throws IOException {
byte[] chars = info.getBytes(CHARSET_UTF8);
outputStream.write(chars, 0, chars.length);
}
}
要测试上述代码:
>
对于有效引脚,使用“a”
作为测试数据。
{
"errorMessage": "2017-10-15T21:35:58.744Z *** Task timed out after 3.00 seconds",
"errorType": "java.lang.RuntimeException"
}
{
"errorMessage": "PIN is wrong: \"B\"",
"errorType": "java.io.IOException",
"stackTrace": [ "example.Hello.handleRequest(Hello.java:83)" ]
}
1)lambda函数中的异常要花那么多时间让Amazon处理是否正常?为什么?如果不是,为什么我会有这个问题?
2)处理异常的推荐方法是什么?我应该永远不让一个函数以异常结束吗?
1)不要在意使用的最大内存。根据我的经验,128 MB对于Java函数来说是很少的,不仅仅是由于JVM开销导致的异常。您应该将它增加到至少4倍。但是,请记住,异常不是免费的:
参见前面的问题:
Java异常的速度有多慢?
http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html?shortfooter=true#api-gateway-proxy-integration-lambda-function-java
问题内容: 当我编译下面的代码时,出现以下错误: 代码: 我已经宣布要抛出它。我想念什么? 完整代码在https://github.com/spakai/composite_indexes中 问题答案: 从Java 8开始,检查异常比Java承诺的要早得多,并且不能与它们很好地配合使用。从技术上讲,BiFunction不会声明抛出任何检查异常。因此,您传递给的,也不能将其抛出。 请通过继承选中。还
当我编译下面的代码时,我得到以下错误: 代码: 我已经宣布它被扔掉了。我错过了什么? 完整的代码在https://github.com/spakai/composite_indexes
我们使用带有Log4j的springaop来登录我们的应用程序。我在应用程序中实现了@Before、@After、@posterhrowing建议。但我面临以下问题: 当任何异常在catch块中被捕获时,它不会调用@afterhrowing通知来打印错误堆栈跟踪。 我想为catch块中捕获的异常打印“错误堆栈跟踪”。意味着无论何时在try块中发生任何异常并被catch捕获,都应该调用一些建议来打印
嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)
问题 你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。 解决方案 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如: >>> def example(): ... try: ... int('N/A') ... except ValueError as e:
问题内容: 我有这样的方法: 我想抛出一个内。编译器不允许我这样做,因为不允许将我的方法扔在那里。但是我需要抛出一个的子类来进行测试 (我不能抛出Unchecked)。显然这是一个hack,但我需要进行测试。我尝试过EasyMock,但它也不允许我这样做。任何想法如何做到这一点? 谢谢,肖恩·阮 问题答案: 方法1: Alexey Ragozin的这篇文章介绍了如何使用泛型技巧引发未声明的检查异常