为什么 try/catch 异常不适用于 Gson.fromJson()?
Why isn't try/catch Exceptions working for Gson.fromJson()?
我通过调用 Gson.fromJson() 获得了 com.google.gson.JsonSyntaxException,因此添加了一个 catch(Exception) 逻辑,但错误从未被捕获,只是被抛出!
这是我的:
Request request = new Request.Builder()
.url(getOrderUrlWithId)
.get()
.build();
try {
Response response = this.okHttpClient.newCall(request).execute();
GetOrderResult orderResult = gson.fromJson(gson.toJson(response.body().string()), GetOrderResult.class);
response.close();
} catch (IOException e) {
log.error("Error retrieving order : " + e.getMessage(), e);
throw new RuntimeException(e);
} catch (Exception e) {
log.error("Error happening for client PO: " + clientPO, e);
return null;
}
当我 运行 测试时,我得到“com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
“
为什么错误没有被捕获?
这是堆栈跟踪:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.Gson.fromJson(Gson.java:927)
at com.google.gson.Gson.fromJson(Gson.java:892)
at com.google.gson.Gson.fromJson(Gson.java:841)
at com.google.gson.Gson.fromJson(Gson.java:813)
at com.hub.fulfill.circlegraphics.getOrdersByCgOrderId(CircleGraphicsApi.java:164)
when(...).thenReturn(null) 指出您使用了一些模拟库(jMock、Mockery 或 simular)。并且您定义如果 fromJson("test", Fulfillment.class) 被调用 mock 应该 return null。由于您已经定义了结果,因此不会调用实际方法 fromJson。
如果您希望抛出期望,请删除行
when(gson.fromJson("test", Fulfillment.class)).thenReturn(null);
想通了。结果是 @Slf4j 的 log.error() 调用将异常显示为 Google StackDriver 中的错误,因此告诉我我遇到了数百万个错误。
你需要像这样捕获 JsonSyntaxException
对于 Kotlin
catch(e: JsonSyntaxException){
//show toast/snackabar/log here
}
对于Java
catch(JsonSyntaxException e){
//show toast/snackabar/log here
}
之前我也在抓java.lang.IllegalStateException,但是没用。
似乎这里的根异常是 JsonSyntaxException,因此,我们需要捕获这个异常。
它对我有用!
我通过调用 Gson.fromJson() 获得了 com.google.gson.JsonSyntaxException,因此添加了一个 catch(Exception) 逻辑,但错误从未被捕获,只是被抛出!
这是我的:
Request request = new Request.Builder()
.url(getOrderUrlWithId)
.get()
.build();
try {
Response response = this.okHttpClient.newCall(request).execute();
GetOrderResult orderResult = gson.fromJson(gson.toJson(response.body().string()), GetOrderResult.class);
response.close();
} catch (IOException e) {
log.error("Error retrieving order : " + e.getMessage(), e);
throw new RuntimeException(e);
} catch (Exception e) {
log.error("Error happening for client PO: " + clientPO, e);
return null;
}
当我 运行 测试时,我得到“com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ “
为什么错误没有被捕获?
这是堆栈跟踪:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.Gson.fromJson(Gson.java:927)
at com.google.gson.Gson.fromJson(Gson.java:892)
at com.google.gson.Gson.fromJson(Gson.java:841)
at com.google.gson.Gson.fromJson(Gson.java:813)
at com.hub.fulfill.circlegraphics.getOrdersByCgOrderId(CircleGraphicsApi.java:164)
when(...).thenReturn(null) 指出您使用了一些模拟库(jMock、Mockery 或 simular)。并且您定义如果 fromJson("test", Fulfillment.class) 被调用 mock 应该 return null。由于您已经定义了结果,因此不会调用实际方法 fromJson。 如果您希望抛出期望,请删除行
when(gson.fromJson("test", Fulfillment.class)).thenReturn(null);
想通了。结果是 @Slf4j 的 log.error() 调用将异常显示为 Google StackDriver 中的错误,因此告诉我我遇到了数百万个错误。
你需要像这样捕获 JsonSyntaxException
对于 Kotlin
catch(e: JsonSyntaxException){
//show toast/snackabar/log here
}
对于Java
catch(JsonSyntaxException e){
//show toast/snackabar/log here
}
之前我也在抓java.lang.IllegalStateException,但是没用。 似乎这里的根异常是 JsonSyntaxException,因此,我们需要捕获这个异常。 它对我有用!