1

mvc 3(razor)アプリケーションのカスタム例外を作成しようとしています。しかし、それは正しく機能していません。

以下は、カスタム例外クラス用に作成したコードです。

using System;
using System.Web.Mvc;

namespace TestApp.Helpers
{
    public class CustomExceptionAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.ExceptionHandled && filterContext.Exception is Exception)
            {
                //filterContext.Result = new RedirectResult("/shared/Error.html");
                filterContext.Result = new ViewResult { ViewName = "Error" };
                filterContext.ExceptionHandled = true;
            }
        }
    }
}

以下はコントローラーのコードです。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Text;
using TestApp.Domain;
using TestApp.Helpers;

namespace TestApp.Controllers
{
    [CustomException]
    public class MyController : Controller
    {
        private TestAppEntities db = new TestAppEntities();

        public ActionResult Create(int id)
        {
           // Throwing exception intentionally
           int a = 1;
           int b = 0;
           int c = a / b;
           //This is another method which is working fine.
           return View(CreateData(id, null));
        }
    }
}

そして以下は「Error.cshtml」のコードです

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = "Error";
}
<h2>
    Sorry, an error occurred while processing your request.
</h2>
<div>
    <p>
        There was a <b>@Model.Exception.GetType().Name</b> while rendering <b>@Model.ControllerName</b>'s
        <b>@Model.ActionName</b> action.
    </p>
    <p>
        The exception message is: <b><@Model.Exception.Message></b>
    </p>
    <p>Stack trace:</p>
    <pre>@Model.Exception.StackTrace</pre>
</div>

アプリケーションを実行すると、モデルがnullであるため、@ Model.Exception.GetType()。Nameでエラーがスローされます。これは正確なエラーです:NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

エラーの正確な理由を教えてください。どうすればこれを修正できますか?

4

1 に答える 1

1

HandleErrorInfoインスタンスをビューに渡す必要があります。

string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];

HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
filterContext.Result = new ViewResult
{
   ViewName = "Error",   
   ViewData = new ViewDataDictionary<HandleErrorInfo>(model)
};
于 2012-11-28T14:37:17.450 に答える