0

データを取得するために GridView と ObjectDataSource を使用する SharePoint WebPart を作成しています。接続が終了したとき (さまざまな理由で)、例外をキャッチし、ユーザーを情報付きのページにリダイレクトしたいと考えています。WebPart が他の WebParts に配置されるか、ページに直接配置されるかはわかりません。

ObjectDataSource にバインドされたクラスの Select メソッドで Exception をスローして、エラーをシミュレートします。

public List<Item> getItems(String param, int maximumRows, int startRowIndex)
{
    if (param == "a") throw new Exception("exception");

コードでデータバインディングを呼び出すたびに例外をキャッチできます (例):

try
{
    gvMain.PageIndex = 0; //gvMian - SPGridView
    gvMain.DataBind();

}
catch (Exception ex)
{
    Page.Cache["cacheError"] = ex.Message;
    SPUtility.Redirect(SPUtility.GetPageUrlPath(HttpContext.Current) + "?wnd=err", SPRedirectFlags.Trusted, HttpContext.Current);         
}

ただし、ページが例外をキャッチできない場合があり (おそらくデータ バインディングが自動的に呼び出されます)、スタック トレースでサーバー エラーが表示されます。

[Exception: exception]
   MyProject.odsClass.getItems(String param, Int32 maximumRows, Int32 startRowIndex) +211

[TargetInvocationException: Obiekt docelowy wywołania zgłosił wyjątek.]
   System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) +0
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +1255
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +38
   System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod method, Boolean disposeInstance, Object& instance) +897
   System.Web.UI.WebControls.ObjectDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1848
   System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +27
   System.Web.UI.WebControls.DataBoundControl.PerformSelect() +261
   System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +82
   System.Web.UI.WebControls.GridView.OnPreRender(EventArgs e) +46
   System.Web.UI.Control.PreRenderRecursiveInternal() +108
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3394

このMSDNページで、WebPart境界でこの種の例外をキャッチすることを推奨する素敵な写真を見つけましたが、提供された例は明確ではありません(この境界は私のWebPartコードのどこにあるでしょうか?)

この種の例外をキャッチする方法、コードでそれを処理する方法、またはこの問題を他の方法で処理する方法に関する提案や例に感謝します。

4

1 に答える 1

1

ObjectDataSource の選択されたイベントをサブスクライブすると、そこでエラーを適切に処理できるはずです。これはここで説明されています:

ObjectDatasource の Select メソッドで例外がスローされた場合の処理​​方法は?

SharePoint に関する私の主な不満の 1 つは、ページにあるような単純な UnhandledException フックが Web パーツにないことです。これは悪い設計パターンかもしれませんが、SharePoint のような分離されたシステムでは、1 人のミスがすべてを台無しにしないのは確かに素晴らしいことです。/暴言。

于 2013-10-18T17:42:44.913 に答える