【发布时间】:2020-10-30 23:00:36
【问题描述】:
我正在使用 Utf8 json 库使用 DeserializeAsync 类的 DeserializeAsync 方法反序列化我的 JSON。有时我看到它抛出异常 -
Arithmetic operation resulted in an overflow.
所以看起来我的 JSON 数据的值太大而无法放入我们对象的某个属性中,从而导致此溢出异常。下面是我最初的代码,我们没有捕捉到从下面的代码抛出的任何异常 -
using (var content = httpResponseMessage.Content)
{
if (content == null) return (default(T), statusCode);
using (var responseStream = await httpResponseMessage.Content.ReadAsStreamAsync())
{
deserializedValue = await JsonSerializer.DeserializeAsync<T>(responseStream, formatResolver);
}
}
所以现在我将上面的代码包装在一个 try catch 中,这样我就可以捕获异常而不是抛出它并记录请求的主体 -
using (var content = httpResponseMessage.Content)
{
if (content == null) return (default(T), statusCode);
using (var responseStream = await httpResponseMessage.Content.ReadAsStreamAsync())
{
try
{
deserializedValue = await JsonSerializer.DeserializeAsync<T>(responseStream, formatResolver);
}
catch (JsonParsingException ex)
{
var bodyString = ex.GetUnderlyingByteArrayUnsafe();
var error = (bodyString != null) ? $"Failing json: {bodyString}" : null;
logger.logError(error, ex.Message, "Deserialization Exception", ex.StackTrace, (int)statusCode);
return (default(T), HttpStatusCode.BadRequest);
}
catch (Exception ex)
{
logger.logError("Cannot Deserialize JSON", ex.Message, "Deserialization Exception", ex.StackTrace, (int)statusCode);
return (default(T), HttpStatusCode.BadRequest);
}
}
}
问题陈述
我想看看有没有办法把上面的两个catch块合并到一个Exception块里面?我尝试使用下面的代码,但它在ex.GetUnderlyingByteArrayUnsafe() 这一行抱怨,因为它找不到GetUnderlyingByteArrayUnsafe 方法。我的想法是在请求无法反序列化 json 时记录该请求,并尽可能写入一个 catch 块。
catch (Exception ex)
{
var bodyString = ex is JsonParsingException? ex.GetUnderlyingByteArrayUnsafe() : null;
var error = (bodyString != null) ? $"Failing json: {bodyString}" : "Cannot Deserialize JSON";
logger.logError(error, ex.Message, "Deserialization Exception", ex.StackTrace, (int)statusCode);
return (default(T), HttpStatusCode.BadRequest);
}
我还在查看 Utf8 json git repo,但我没有看到 DeserializeAsync 方法抛出任何 JsonParsingException 异常?
【问题讨论】:
-
var bodyString = (ex as JsonParsingException)?.GetUnderlyingByteArrayUnsafe();