0

我有一个 MVC 应用程序,它基本上有两个堆栈跟踪,我想知道为什么有两个堆栈跟踪?

[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67

[InvalidOperationException: An error occurred when trying to create a controller of type 'PteDotNet.Web.Controllers.BlogController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232
   System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49
   System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8970356
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
4

3 回答 3

0

一个是内部异常的堆栈跟踪。

看起来你首先得到了一个MissingMethodException, 有理由的

没有为此对象定义无参数构造函数。

这导致了一个InvalidOperationException,有理由的

尝试创建类型为“PteDotNet.Web.Controllers.BlogController”的控制器时出错。确保控制器有一个无参数的公共构造函数。

所以显然你BlogController需要一个无参数的构造函数。

于 2012-05-08T12:43:27.037 回答
0

我不完全确定,但它看起来像根本原因:

首先MissingMethodException被解雇,然后InvalidOperationException被解雇,因为第一个例外

于 2012-05-08T12:43:57.290 回答
0

InvalidOperationException是引发的异常,但它是作为 a 的结果引发的,并且MissingMethodException此异常包含在InnerException的 中InvalidOperationException。解释了出InvalidOperationException了什么问题,但是查看InnerException您可以首先看到故障是在哪里触发的。

当您评估ToString()带有内部异常的异常时,您会获得所有嵌套内部异常的堆栈跟踪,以帮助您理解问题。一个常见的错误是ex.Message + ex.StackTrace用于诊断目的,但您会丢失有关内部异常的信息。除非您想隐藏这些有价值的信息,否则您应该ex.ToString()在记录异常时始终使用。

在 MVC 框架中有类似这样的代码:

try {
  // Will throw MissingMethodException if there is no parameterless constructor.
  var controller =  Activator.CreateInstance(type);
  ...
}
catch (MissingMethodException ex) {
  var message = String.Format("An error occurred when trying to create a controller of type '{0}'. Make sure that the controller has a parameterless public constructor.", type);
  throw new InvalidOperationException(message, ex);
}

因此,与其得到一个MissingMethodException可能会让你感到困惑的东西,不如得到InvalidOperationException一个很好的解释。这是异常处理方面的最佳实践示例。

于 2012-05-08T12:47:33.963 回答