Стратегия обработки ошибок для изолированных решений SharePoint

Я хочу разработать стратегию обработки ошибок для решения SharePoint, в котором используются изолированные веб-части. Первоначально я рассматривал общий подход к обработке исключений, основанный на этом article, но это не работает для изолированных веб-частей. Как только необработанное исключение было выброшено в песочнице, служба пользовательского кода, кажется, берет на себя управление, так что обработка исключений в базовой веб-части не достигается. Существуют ли какие-либо устоявшиеся подходы к обработке ошибок для изолированных решений?

Кто-нибудь знает о методе определения момента возникновения необработанного исключения в изолированной веб-части, хотя бы для того, чтобы изменить отображаемое сообщение об ошибке на более удобное для пользователя сообщение? Я хотел бы заменить стандартное сообщение «Ошибка веб-части: необработанное исключение было вызвано методом Execute изолированного кода в домене приложения частичного доверия: произошла непредвиденная ошибка.» по крайней мере.

Спасибо, MagicAndi.


person MagicAndi    schedule 24.04.2012    source источник
comment
Можете ли вы опубликовать свой образец, который вы использовали, в песочнице? Я полагаю, что сообщение, которое вы получаете, на самом деле всплывает необработанное исключение. В статье автор просто заворачивает все события. Я думаю, что такой подход должен работать нормально.   -  person Roman    schedule 25.04.2012


Ответы (1)


Собственно, вы можете следовать подходу, предложенному в упомянутой вами статье. Вам просто нужно предоставить безопасные переопределения для всех виртуальных свойств и методов, которые ваши потомки веб-части собираются переопределить. Скороговорку можно описать:

  1. Переопределите и запечатайте каждое виртуальное свойство и метод, которые предполагается переопределить, с помощью кода, который может вызвать исключение.
  2. Создайте виртуальный аналог заменяемого объекта с тем же прототипом и при необходимости вызовите из него базовый класс. Предполагается, что это будет отвергнуто вашими потомками.
  3. Вызовите новый переопределяемый элемент из запечатанного члена в try & catch и запомните исключение, если оно было обнаружено там.
  4. Метод визуализации отображает либо обычный контент, либо запомненное сообщение об ошибке.

Это торс базового класса, который я использую:

public class ErrorSafeWebPart : WebPart {

    #region Error remembering and rendering

    public Exception Error { get; private set; }

    // Can be used to skip some code later that needs not
    // be performed if the web part renders just the error.
    public bool HasFailed { get { return Error != null; } }

    // Remembers just the first error; following errors are
    // usually a consequence of the first one.
    public void RememberError(Exception error) {
        if (Error != null)
            Error = error;
    }

    // You can do much better error rendering than this code...
    protected virtual void RenderError(HtmlTextWriter writer) {
        writer.WriteEncodedText(Error.ToString());
    }

    #endregion

    #region Overriddables guarded against unhandled exceptions

    // Descendant classes are supposed to override the new DoXxx
    // methods instead of the original overridables They should
    // not catch exceptions and leave it on this class.

    protected override sealed void CreateChildControls() {
        if (!HasFailed)
            try {
                DoCreateChildControls();
            } catch (Exception exception) {
                RememberError(exception);
            }
    }

    protected virtual void DoCreateChildControls()
    {}

    protected override sealed void OnInit(EventArgs e) {
        if (!HasFailed)
            try {
                DoOnInit(e);
            } catch (Exception exception) {
                RememberError(exception);
            }
    }

    protected virtual void DoOnInit(EventArgs e) {
        base.OnInit(e);
    }

    // Continue similarly with OnInit, OnLoad, OnPreRender, OnUnload 
    // and/or others that are usually overridden and should be guarded.

    protected override sealed void RenderContents(HtmlTextWriter writer) {
        // Try to render the normal contents if there was no error.
        if (!HasFailed)
            try {
                DoRenderContents(writer);
            } catch (Exception exception) {
                RememberError(exception);
            }
        // If an error occurred in any phase render it now.
        if (HasFailed)
            RenderError(writer);
    }

    protected virtual void DoRenderContents(HtmlTextWriter writer) {
        base.RenderContents(writer);
    }

    #endregion
}

--- Ферда

person Ferdinand Prantl    schedule 29.04.2012