Ловля необработанных исключений в ASP.NET UserControls

== является -оператором , а equals() является методом .

Операторы обычно используются для примитива и, следовательно, == используется для сравнения адресов памяти, а метод equals() используется для сравнения объектов .

5
задан markom 14 August 2008 в 08:06
поделиться

6 ответов

mmilic, следуя за Вашим ответом на мою предыдущую идею..

Никакая дополнительная логика не требуется! В этом суть, Ваше выполнение ничего к рассматриваемым классам, просто перенеся их в некоторую пузырчатую упаковку инстанцирования!:)

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

ИЗВИНЕНИЯ ЗА ДЛИННОЕ СООБЩЕНИЕ

SafeLoader

Это в основном будет "пузырем", который я упомянул.. Это получит средства управления HTML, фиксируя любые ошибки, которые происходят во время Рендеринга.

public class SafeLoader
{
    public static string LoadControl(Control ctl)
    {
        // In terms of what we could do here, its down
        // to you, I will just return some basic HTML saying
        // I screwed up.
        try
        {
            // Get the Controls HTML (which may throw)
            // And store it in our own writer away from the
            // actual Live page.
            StringWriter writer = new StringWriter();
            HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);
            ctl.RenderControl(htmlWriter);

            return writer.GetStringBuilder().ToString();
        }
        catch (Exception)
        {
            string ctlType = ctl.GetType().Name;
            return "<span style=\"color: red; font-weight:bold; font-size: smaller;\">" + 
                "Rob + Controls = FAIL (" + 
                ctlType + " rendering failed) Sad face :(</span>";
        }
    }
}

И некоторые средства управления..

Хорошо я просто дразнил вместе два средств управления здесь, каждый бросит другой, представит спам. Укажите здесь, я не даю дерьма. Они будут заменены Вашими пользовательскими элементами управления..

BadControl

public class BadControl : WebControl
{
    protected override void Render(HtmlTextWriter writer)
    {
        throw new ApplicationException("Rob can't program controls");
    }
}

GoodControl

public class GoodControl : WebControl
{
    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write("<b>Holy crap this control works</b>");
    }
}

Страница

Хорошо, поэтому позволяет взгляду на "тестовую" страницу.. Здесь я просто инстанцирую средств управления, захватываю их HTML и произвожу его, я буду следовать с мыслями о поддержке разработчика и т.д.

Код страницы - позади

    protected void Page_Load(object sender, EventArgs e)
    {
        // Create some controls (BadControl will throw)
        string goodHtml = SafeLoader.LoadControl(new BadControl());
        Response.Write(goodHtml);

        string badHtml = SafeLoader.LoadControl(new GoodControl());
        Response.Write(badHtml);
    }

Мысли

Хорошо, я знаю то, что Вы думаете, "эти средства управления инстанцируют программно, что относительно поддержки разработчика? Я провел долбаные часы, получая эти средства управления, хорошие для разработчика, теперь Вы смешиваете с моим заклинанием".

Хорошо, таким образом, я еще действительно не протестировал это (вероятно, сделает в минуту!), но идея здесь состоит в том, чтобы переопределить метод CreateChildControls для страницы и взять экземпляр каждого управления, прибавил форму и выполнил его через SafeLoader. Если код передает, можно добавить его к набору Средств управления как нормальный, в противном случае затем можно создать ошибочные литералы или что-то до Вас мой друг.

Наконец..

Снова, жаль о длинном сообщении, но я хотел получить код здесь, таким образом, мы можем обсудить это :) Я надеюсь, что это помогает продемонстрировать мою идею :)

Обновление

Протестированный путем отказывания от управления на разработчике и переопределения метода CreateChildControls с этим, хорошо работает, возможно, нуждается в некоторой уборке для создания вещей лучше выглядящими, но я оставлю это Вам ;)

protected override void CreateChildControls()
{
    // Pass each control through the Loader to check
    // its not lame
    foreach (Control ctl in Controls)
    {
        string s = SafeLoader.LoadControl(ctl);
        // If its bad, smack it downnnn!
        if (s == string.Empty)
        {
            ctl.Visible = false; // Prevent Rendering
            string ctlType = ctl.GetType().Name;
            Response.Write("<b>Problem Occurred Rendering " + 
                ctlType + " '" + ctl.ID + "'.</b>");
        }
    }
}

Приятного отдыха!

12
ответ дан 18 December 2019 в 09:55
поделиться

Это - интересная проблема.. Я все еще довольно нов когда дело доходит до пользовательских элементов управления и т.д., но здесь являюсь своими мыслями (не стесняйтесь комментировать/исправлять людей!).. (Я - вид взглядов/записи вслух здесь!)

  • Если бы ошибка происходит во время рендеринга, в некоторых случаях, разве не было бы слишком поздно? (так как некоторые средства управления HTML, возможно, были уже отправлены Устройству записи и произведены).
  • Поэтому разве не было бы лучше перенести Метод рендеринга пользовательского элемента управления, а скорее, чем передача его ссылка на "Живой" HtmlTextWriter, Вы передаете свое собственное, захватываете какие-либо Исключения, повышенные в этой небольшой безопасности "пузырь", если все подходит, Вы затем передаете свой результирующий HTML фактическому HtmlTextWriter?
  • Эта логика могла, вероятно, быть брошена к универсальному классу обертки, который Вы будете использовать для динамичного загружения/представления средств управления во время выполнения..
  • Если какие-либо ошибки действительно происходят, у Вас есть вся информация, в которой Вы нуждаетесь в Вашем распоряжении! (т.е. ссылки управления и т.д.).

Просто мои мысли, пламя далеко! :D ;)

4
ответ дан 18 December 2019 в 09:55
поделиться

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

public abstract class SilentErrorControl : UserControl
{
    protected override void Render( HtmlTextWriter writer )
    {
        //call the base's render method, but with a try catch
        try { base.Render( writer ); }
        catch ( Exception ex ) { /*do nothing*/ }
    }
}

Затем наследуйте SilentErrorControl вместо UserControl.

1
ответ дан 18 December 2019 в 09:55
поделиться

Global.asax и Application_Error?

http://www.15seconds.com/issue/030102.htm

Или Событие Page_Error на человеке Page только:

http://support.microsoft.com/kb/306355

void Page_Load(object sender, System.EventArgs e)
{
    throw(new ArgumentNullException());
}

public void Page_Error(object sender,EventArgs e)
{
    Exception objErr = Server.GetLastError().GetBaseException();
    string err =    "<b>Error Caught in Page_Error event</b><hr><br>" + 
                    "<br><b>Error in: </b>" + Request.Url.ToString() +
                    "<br><b>Error Message: </b>" + objErr.Message.ToString()+
                    "<br><b>Stack Trace:</b><br>" + 
                      objErr.StackTrace.ToString();
    Response.Write(err.ToString());
    Server.ClearError();
}

Кроме того, Karl Seguin (Привет Karl!) имел Сообщение при использовании HttpHandler вместо этого:

http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx

(Не уверенный, что разрешение воспроизвести его, но если Вы хотите описать ответ, Вы получили мой Upvote ☺),

0
ответ дан 18 December 2019 в 09:55
поделиться

Как насчет того, чтобы добавить новый подкласс UserControl, что ошибочные дескрипторы его методы рендеринга и загрузки (так, чтобы они скрылись, как Вы желаете), и затем наследовавшийся этому для Ваших пользовательских элементов управления?

0
ответ дан 18 December 2019 в 09:55
поделиться

Я не уверен, что понимаю Ваш ответ.. Как Вы загружаете свои средства управления и добавляете их к Вашему набору средств управления?

Это было самым главным бита, добавленного в разделе "Update".. У Вас есть гибкость для использования SafeLoader везде, где Вам нравится.

Я не уверен, почему Вы чувствуете, что у Вас нет доступа/управления по HTML? Цель SafeLoader состоит в том, что Вы не заботитесь, каков HTML, Вы просто пытаетесь "произвести" управление (в "пузыре") и определить, загружается ли это хорошо в его текущем состоянии.

Если это делает (т.е. HTML возвращается), затем, можно сделать то, что Вы любите с ним, производите HTML, добавьте управление к набору средств управления, безотносительно!

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

Я надеюсь, что это помогает разъяснить вещи для Вас, в противном случае затем, кричите :)

0
ответ дан 18 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: