关于重复。即使可以在调试过程中看到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 });
}
前没有说什么
ex.InnerException显示相同的消息
ex.InnerException.InnerException。最后是一些真实的消息,
"db table duplicated key"
ex.InnerException.InnerException.Message我可以获得消息。
但是,即使有一个属性
"the guilty key"
,也无法获取详细信息Detail
那么如何获得详细信息?
奖励:为什么必须深入两次
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个内部异常的事实是偶然的。取决于捕获和包装异常的次数,将确定您关心异常的深度-最好的选择是遍历异常堆栈以查找要处理的异常类型。