如何在VIewBag.Message中获取Sql异常 - asp.net MVC

时间:2018-02-02 18:22:09

标签: c# asp.net-mvc

我正在尝试捕获异常消息并提醒用户 因此,当我使用异常时,它可以正常使用消息"有关详细信息,请参阅内部异常"我想要的是显示sql异常,例如我的方案中的重复键我想从触发器接收消息。

try {
    if (ModelState.IsValid)
    {
        db.Entry(investor).State = EntityState.Modified;
        db.SaveChanges();

        if (amount != 0)
        {
            InvestorPeriod ip = new InvestorPeriod();
            ip.InvestorID = investor.InvestorID;
            ip.Amount = amount;
            ip.RemainingAmount = amount;
            ip.InvestorPeriodStatusID = 1;
            db.InvestorPeriods.Add(ip);
            db.SaveChanges();
        }
    }
}
catch (SqlException ex)
{ 
    // I want to display the sqlexception instead of the "please see inner exception for details" and then display it a dialog

    ViewBag.Error = ex.Message;
}

2 个答案:

答案 0 :(得分:0)

以下是如何获取所有内部异常的示例代码

catch (SqlException ex)
{ 
    // All message will be stored here.
    var exceptionMessages = new List<string>();
    exceptionMessages.Add(ex.Message);
    while(ex.InnerException != null)
    {
         ex = ex.InnerException;
         exceptionMessages.Add(ex.Message);
    }

    // Add messages to ViewBag
    ViewBag.Error = string.Join(" ", exceptionMessages);

}

答案 1 :(得分:0)

.NET有一种自动检索内部异常的方法(这就是你被要求做的事情) - Exception.GetBaseException()。因此,您只需将最后一行更改为:

ViewBag.Error = ex.GetBaseException().Message;

有时你确实希望获得所有异常消息,在这种情况下你必须循环遍历InnerExceptions(或者如果异常是AggregateException则展平它们)