【问题标题】:Cannot catch exceptions in ActionResult无法在 ActionResult 中捕获异常
【发布时间】:2019-11-27 18:17:41
【问题描述】:

您好,我正在尝试在此动作控制器中捕获异常,我想在输出和模态中显示异常,这两种情况都不起作用

方法:

[HttpPost]
public ActionResult PostDepartment(Department DM)
{
    try
    {
        if (DM.OperationType == "Save")
        {
            using (dbConn ef = new dbConn())
            {
                Department dept = new Department();

                short Id = Convert.ToInt16(ef.Department.Max(field => (short?)field.DepartmentID) + 1 ?? 1);
                dept.DepartmentID = Id;
                dept.Name = DM.Name;
                dept.GroupName = DM.GroupName;
                dept.ModifiedDate = DateTime.Now;
                ef.Department.Add(dept);
                ef.SaveChanges();
            }
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
        return Json(new { error = ex.Message });
    }
    return new HttpStatusCodeResult(201);
 }

断点显示消息在那里

然后什么都没有发生,它进入了我的 ajax 调用的成功部分

    error: function (e) {
        $.unblockUI();
        $('#errorModalmsg').text(e.responseJSON.error);
        $('#errorModal').modal('show');
    },
    success: function () {
        $.unblockUI();
        departmentPostSuccess();
        $('#departmentTable').DataTable().ajax.reload();
    }

我错过了什么?

编辑:我更关心为什么 Diagnostics.Debug 没有捕捉到任何东西,我尝试了不同类型的错误

编辑 2 解决方案: 我关心的是将内部 .NET 异常带到视图中,所以我发现这样做here 最后我无法使 Diagnostics.Debug 输出工作

catch (Exception ex)
{
    return new HttpStatusCodeResult(500, " :( Something bad happened: " + ex.Message);
}

Ajax,它也出现在浏览器控制台中

error: function (xhr, httpStatusMessage, customMessage) {
   if (xhr.status === 500) {
        $.unblockUI();
        $('#errorModalMsg').text(customMessage);
        $('#errorModal').modal('show');
   }
}

【问题讨论】:

  • return Json(new { error = ex.Message }); 将是一个成功的 HTTP 状态代码。您的 ajax 代码不会将其检测为错误情况。

标签: c# asp.net-mvc


【解决方案1】:

return Json() 基本上意味着您实际上以 200 状态代码响应。这意味着您的 success 代码将实际执行。

如果您希望调用 error 函数,那么您的请求应该会失败(4xx 或 5xx 状态代码)。

一种可能的解决方法:

success: function (response) {
        if(response.error){
           //do stuffs
           return;
        }
        $.unblockUI();
        departmentPostSuccess();
        $('#departmentTable').DataTable().ajax.reload();
    }

【讨论】:

    【解决方案2】:

    正如其他人指出的那样,返回 Json 本质上是返回 200 OK 响应。您需要返回某种错误。

    就个人而言,我会避免捕获这个通用异常,除非您计划添加某种日志记录或在捕获中执行某种逻辑。但是,如果您想保留捕获,我会在将您的异常消息记录到控制台后简单地抛出异常:

    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
        throw ex;
    }
    

    【讨论】:

    • 它说的是未处理的异常,但我把它扔到了输出端,这让我很困扰我不知道为什么它没有显示在输出控制台中
    • @RobertoTorres 您指的是 Web 浏览器中的输出控制台吗?或者你的视觉工作室输出控制台
    • 视觉工作室中的输出
    • 在此处查看此问题,看看是否能解决您的问题stackoverflow.com/questions/1159755/…
    • Console 类仅用于控制台项目,Debug 是需要的,它适用于 WebForms 我怀疑这不起作用,因为我目前正在研究的项目的 MVC 特性将发布更新
    【解决方案3】:

    您可以通过变量传递操作结果以响应成功, 然后在javascript中检查是否成功,如果成功则显示成功消息,否则显示错误消息

    success: function (response) {
            if (response.success) {
                 $.unblockUI();
                 departmentPostSuccess();
                 $('#departmentTable').DataTable().ajax.reload();
            } else {
               $.unblockUI();
               $('#errorModalmsg').text(response.error);
               $('#errorModal').modal('show');
            }                          
        },
        error: function (response) {
            alert("error!");  // 
        }
    
     catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            return Json(new { success=false, error = ex.Message });
        }
         return Json(new { success=true});
    

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2021-08-07
      • 2021-10-14
      • 2014-05-02
      • 2017-03-15
      • 2013-11-23
      • 2017-09-16
      相关资源
      最近更新 更多