由WebControls引起的SharePoint WebPart捕获错误

时间:2013-10-18 15:18:07

标签: c# asp.net .net sharepoint

我正在创建一个使用GridView和ObjectDataSource检索数据的SharePoint WebPart。当连接终止(出于不同的原因)时,我想捕获异常并将用户重定向到包含信息的页面。我不知道我的WebPart是放在其他WebParts中还是直接放在页面上。

我通过在我的类的Select方法中将Exception抛出到ObjectDataSource来模拟错误:

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

On this MSDN page我发现了一张很好的图片,建议在WebPart边界上捕获这种异常,但是他们提供的示例对我来说并不清楚(这个边界在我的WebPart代码中会在哪里?)

对于如何捕获此类异常,如何在我的代码中处理它或有关如何以任何其他方式处理此问题的任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您订阅了ObjectDataSource的选定事件,那么您应该能够在那里充分处理错误。这在这里解释:

How to handle an exception is thrown by Select method of ObjectDatasource?

我对SharePoint的一个主要抱怨是webpart上没有像页面上那样简单的UnhandledException挂钩。它可能是一个糟糕的设计模式,但在像SharePoint这样的解耦系统中,如果一个人的错误没有把整个事情搞砸,那肯定会很好。 /咆哮。