我有一个控制器Action,其视图与我的应用程序的其余部分截然不同,并且我希望该Action抛出的任何异常都显示与我的应用程序的其余部分不同的错误页面。

我已经修改了HandleError属性,但是当发生异常时,它根本不加载错误页面。

    [HttpPost]
    [HandleError(View = "UPI_Error")]
    public ActionResult ParticipantUpdate1(Participant part)
    {
        try
        {
            mps.ParticipantUpdate(LogonTicket, ParticipantID, part);
        }
        catch(Exception ex)
        {
            string x = ex.Message;
        }
        return View();
    }


有任何想法吗?

更新

OK,修改为:

[HttpPost]
[HandleError(View = "UPI_Error", ExceptionType = typeof(ArgumentException))]
public ActionResult ParticipantUpdateSuccess(Participant part)
{
    // Copy the new stuff into the original ParticipantInfo before updating essentially "merging"
    Participant OrigPart = CopyParticipant(part);
    try
    {
        string result = mps.ParticipantUpdate(LogonTicket, ParticipantID, OrigPart);
        if (result != "Update Success")
        {
            throw new ArgumentException(result);
        }
    }
    catch (Exception e)
    {
        throw new ArgumentException(e.Message);
    }
    return View();
}


但是,它仍然不会加载UPI_Error页面。 ParticipantUpdate调用将引发此异常:

System.ServiceModel.FaultException`1 was unhandled by user code
  HResult=-2146233087
  Message=ORA-12899: value too large for column "CLI"."CLI_MAIN_ZIP" (actual: 21, maximum: 11)


在此链接的文章中:http://www.c-sharpcorner.com/UploadFile/ff2f08/exception-or-error-handling-in-Asp-Net-mvc-using-handleerror/

它说HandleError无法捕获控制器外部引发的异常。由于该异常发生在我的Web服务中并传播到我的应用程序,这可能是问题的一部分吗?

但是,当我从Web服务中捕获一个异常时,我抛出了一个新异常,它仍然显示YSOD与我的自定义错误页面。

更新

好吧,我决定走另一条路。我捕获到异常,将异常对象复制到TempData,然后调用我的自定义视图。但是,由于某种原因,我无法更改视图中的布局。它带有空引用异常。还有其他想法吗?

[HttpPost]
[HandleError(View = "UPI_Error")]
public ActionResult ParticipantUpdateSuccess(Participant part)
{
    bool error = false;
    // Copy the new stuff into the original ParticipantInfo before updating essentially "merging"
    Participant OrigPart = CopyParticipant(part);
    try
    {
        string result = mps.ParticipantUpdate(LogonTicket, ParticipantID, OrigPart);
        if (result != "Update Success")
        {
            throw new ArgumentException(result);
        }
    }
    catch (Exception ex)
    {
        error = true; //  throw new ArgumentException(e.Message);
        TempData["exception"] =  ex;
    }
    if (!error)
    {
        return View();
    }
    else
    {
        return RedirectToAction("UPIError");
    }
}

public ActionResult UPIError()
{
    ViewBag.Exception = TempData["exception"];
    return View();
}


抛出异常:

Message =对象引用未设置为对象的实例。
堆栈跟踪:
在... \ Views \ Home \ UPIError.cshtml:第4行中的ASP._Page_Views_Home_UPIError_cshtml.Execute()

这是我的视图中的第4行(是,该视图存在于“共享”文件夹中):

Layout = "~/Views/Shared/_UPILayout.cshtml";


出现了View命名问题,但解决了。现在,我仍然收到Null Reference异常,但是视图在那里并正确命名。

最佳答案

在错误处理程序中,您指定要对类型ArgumentException的异常使用自定义错误视图,而当前引发的异常是System.ServiceModel.FaultException。您是否尝试过捕获更高的Exception类,例如:

[HandleError(View = "UPI_Error", ExceptionType = typeof(Exception))]


或者更具体地测试您的情况:

[HandleError(View = "UPI_Error", ExceptionType = typeof(System.ServiceModel.FaultException))]

10-07 15:58