关于重复。即使可以在调试过程中看到Exception对象的一部分,也可以访问Message属性,但不能访问Detail属性。所以问题是为什么不能访问Detail属性。


我发现一个例外。

catch (Exception ex)
{
    string msg = ex.InnerException.InnerException.Message;
    // say Exception doesnt have Detail property
    // string detail = ex.InnerException.InnerException.Detail;
    return Json(new { status = "Fail", message = msg, detail: detail });
}


前没有说什么
c# - 如何获取InnerException的详细信息-LMLPHP

ex.InnerException显示相同的消息
c# - 如何获取InnerException的详细信息-LMLPHP

ex.InnerException.InnerException。最后是一些真实的消息,"db table duplicated key"
c# - 如何获取InnerException的详细信息-LMLPHP

ex.InnerException.InnerException.Message我可以获得消息。
c# - 如何获取InnerException的详细信息-LMLPHP

但是,即使有一个属性"the guilty key",也无法获取详细信息Detail

c# - 如何获取InnerException的详细信息-LMLPHP


那么如何获得详细信息?
奖励:为什么必须深入两次InnerException才能获得一些有意义的消息?

最佳答案

诀窍是识别抛出的异常类型,并将常规异常转换为正确的类型,然后您将可以访问该异常类型的扩展属性。


例如:

if (processingExcption is System.Data.Entity.Validation.DbEntityValidationException)
{
    exceptionIsHandled = true;
    var entityEx = (System.Data.Entity.Validation.DbEntityValidationException)processingExcption;
    foreach (var item in entityEx.EntityValidationErrors)
    {
        foreach (var err in item.ValidationErrors)
            returnVal.Invalidate(SystemMessageCategory.Error, err.ErrorMessage);
    }
}
else if (processingExcption is System.Data.SqlClient.SqlException && ((System.Data.SqlClient.SqlException)processingExcption).Number == -2)//-2 = Timeout Exception
{
    exceptionIsHandled = true;
    returnVal.Invalidate(SystemMessageCategory.Error, "Database failed to respond in the allotted time. Please retry your action or contact your system administrator for assistance.",
        messageCode: Architecture.SystemMessage.SystemMessageCode.DBTimeout);
}



您正在寻找的细节是2个内部异常的事实是偶然的。取决于捕获和包装异常的次数,将确定您关心异常的深度-最好的选择是遍历异常堆栈以查找要处理的异常类型。

10-08 11:25