检查异常捕获块中的异常类型并记录

安迪

我正在使用Utf8 json库使用DeserializeAsync方法反序列化我的JSON JsonSerializer有时我看到它引发异常-

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异常?

大卫·L

is操作者正在执行在您的异常是否可以转换为所述目标类型的布尔运算,但该类型的转换不然后传递到您的三元的第一分支。

您可以重铸:

var bodyString = ex is JsonParsingException 
    ? ((JsonParsingException)ex).GetUnderlyingByteArrayUnsafe() 
    : null;

或者,您可以使用as运算符,运算符将尝试为您进行转换,如果转换失败,将返回null:

var jsonParsingException = ex as JsonParsingException;
var bodyString = jsonParsingException != null
    ? jsonParsingException.GetUnderlyingByteArrayUnsafe() 
    : null;

请注意,使用C#7模式匹配,您还可以将结果输出到一个临时局部变量并启用单线:

var bodyString = ex is JsonParsingException j
    ? j.GetUnderlyingByteArrayUnsafe() 
    : null;

最后,@ mjwills指出,您可以将as操作括在括号中,并使用null传播运算符检查是否为null,并且也可以使用单行代码:

var bodyString = (ex as JsonParsingException)?.GetUnderlyingByteArrayUnsafe();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章