我使用以下代码从MVC Model State中获取异常:
IEnumerable<string> exceptions = ModelState (x => x.Value.Errors
.Where(error => (error != null) &&
(error.Exception != null) &&
(error.Exception.Message != null))
.Select(error => error.Exception.Message));
对于try-catch块异常我怎么能编写一种方法来获取异常e并使其成为我的异常和内部异常消息也被放入IEnumerable ,就像我上面做的那样? / p>
我的问题是我不知道如何处理可能存在多个异常级别的事实。
不确定这是否有帮助,但这是我之前使用的代码将异常放入字符串中:
public static string GetFormattedErrorMessage(this Exception e)
{
var exError = "";
if ( 1 == 1) {
if (e == null)
{
throw new ArgumentNullException("e");
}
exError = e.Message;
if (e.InnerException != null)
{
exError += "<br>" + e.InnerException.Message;
exError += "<br>" + e.StackTrace;
if (e.InnerException.InnerException != null)
{
exError += "<br>" + e.InnerException.InnerException.Message;
}
}
} else {
exError = "System error";
}
return exError;
}
答案 0 :(得分:4)
你可以遍历内部例外,例如
public IEnumerable<string> GetErrors(Exception ex)
{
...
var results = new List<string>() { ex.Message };
var innerEx = ex.InnerException;
while (innerEx != null)
{
results.Add(innerEx.Message);
innerEx = innerEx.InnerException;
}
return results;
}
答案 1 :(得分:2)
这听起来像递归方法的问题。看看以下内容是否可以帮助您入门。我将由您自行决定是否包含StackTrace并处理AggregateExceptions:
public static IEnumerable<string> FormatExceptionHtml(Exception instance)
{
if (instance != null)
yield return instance.Message + "<br />";
if (instance.InnerException != null)
foreach (var inner in FormatExceptionHtml(instance.InnerException))
{
yield return inner;
}
}
答案 2 :(得分:1)
看起来唯一的“有趣”位是枚举内部异常。无需手动构建数据结构;一个简单的枚举器应该大大简化问题:
public static IEnumerable<Exception> AsEnumerable(this Exception self)
{
for (var e = self; e != null; e = e.InnerException) yield return e;
}
foreach (var e in myException.AsEnumerable()) { /* print debug info */ }
// or
var exceptionString = string.Join("<br>", myException.AsEnumerable().Select(e =>
/* debug info */
));
答案 3 :(得分:0)
使用递归来获得每个级别的异常:
private static string GetFormattedErrorMessage(this Exception ex)
{
StringBuilder sb = new StringBuilder();
if (ex != null)
{
sb.AppendLine(ex.Message);
sb.AppendLine(ex.StackTrace);
sb.AppendLine(ex.InnerException.GetFormattedErrorMessage());
}
return sb.ToString();
}
或使用普通
ex.ToString();
哪个会很好地打印出来。