0

私は MVC アプリケーションを持っており、基本的に 2 つのスタック トレースがあります。

[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

1 つは、内部例外のスタック トレースです。

最初に を取得したようですが、MissingMethodException理由があります

このオブジェクトにはパラメーターなしのコンストラクターが定義されていません。

それが原因でInvalidOperationException、理由があります

タイプ 'PteDotNet.Web.Controllers.BlogController' のコントローラーを作成しようとしたときにエラーが発生しました。コントローラーにパラメーターなしのパブリック コンストラクターがあることを確認します。

どうやらBlogController、パラメータのないコンストラクタが必要です。

于 2012-05-08T12:43:27.037 に答える
0

完全にはわかりませんが、根本的な原因のようです:

MissingMethodExceptionが最初に起動され、次にがInvalidOperationException起動されます。これは、最初の Exception のためです。

于 2012-05-08T12:43:57.290 に答える
0

InvalidOperationExceptionスローされる例外ですが、 の結果としてスローされ、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 に答える