Обработка исключений контролов
От: shepard  
Дата: 21.07.06 08:58
Оценка:
Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?
Re: Обработка исключений контролов
От: kaer  
Дата: 23.07.06 06:08
Оценка:
Здравствуйте, shepard, Вы писали:

S>Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?


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

В любом случае, на мой взгляд, игра не стоит свеч Все равно если развалилась одна часть интерфейса — то вторая может настолько непредсказуемо себя повести, что что-нибудь может сломаться окончательно В данном случае лучше подход — "умерла, так умерла". Цель — чтобы не умирала вовсе
Re[2]: Обработка исключений контролов
От: shepard  
Дата: 24.07.06 06:00
Оценка:
Здравствуйте, kaer, Вы писали:

S>>Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?


K>Либо сам контрол должен уметь не прокидывать exception наверх, а ловить его и в рендер отдавать только строчку ошибки. Либо контрол должен рендерится в контексте отдельного запроса.


это понятно, только как это сделать? по такой схеме работает dotnetnuke, просто не хочется его исходники ковырять, может кто знает
Re[3]: Обработка исключений контролов
От: Dronopotamus Россия  
Дата: 24.07.06 07:02
Оценка:
Здравствуйте, shepard, Вы писали:

S>это понятно, только как это сделать? по такой схеме работает dotnetnuke, просто не хочется его исходники ковырять, может кто знает


я сталкивался с похожей проблемой
у меня есть набор элементов управления, они биндятся к данным с помощью своего механизма биндинга. Инициатором установки данных в контролы и сбора измененных является в конечном счете страница — т.е. если при этом возникает ексепшн — он ловится на странице и отображается как мне надо. Но также эксепшены могли возникать в событиях элементов управления, и поскольку евенты вызываются не из моей страницы, а из инфраструктуры асп.нет — приходилось ловить и обрабатывать их в самих контролах. Через какое-то время я понял, что это криво . Вынес из контролов всю логику, которая зажигалась на события и могла кидать ексепшены, наружу, в сами контролы добавил внятные события и подписываюсь на них на странице.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[3]: Обработка исключений контролов
От: cadet354 Россия
Дата: 24.07.06 07:05
Оценка:
Здравствуйте, shepard, Вы писали:

S>это понятно, только как это сделать? по такой схеме работает dotnetnuke, просто не хочется его исходники ковырять, может кто знает

он загружает динамически контрол,
псевдокод:
try{
    Contol uc=LoadControl("foo.ascx");
    Page.Controls.Add(uc);
}
catch(Exception exc){
    Control uc=LoadControl("exception.ascx");
    uc.Message=exc.Message;
    Page.Controls.Add(uc);
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Обработка исключений контролов
От: shepard  
Дата: 24.07.06 07:11
Оценка:
получу ли я при таком подходе исключение возникшее в обработчике нажатия кнопки в моем контроле, например?

Здравствуйте, cadet354, Вы писали:

C>Здравствуйте, shepard, Вы писали:


S>>это понятно, только как это сделать? по такой схеме работает dotnetnuke, просто не хочется его исходники ковырять, может кто знает

C>он загружает динамически контрол,
C>псевдокод:
C>
C>try{
C>    Contol uc=LoadControl("foo.ascx");
C>    Page.Controls.Add(uc);
C>}
C>catch(Exception exc){
C>    Control uc=LoadControl("exception.ascx");
C>    uc.Message=exc.Message;
C>    Page.Controls.Add(uc);
C>}
C>
Re[4]: Обработка исключений контролов
От: shepard  
Дата: 24.07.06 07:18
Оценка:
то есть грубо говоря, на странице ловить исключения в каждом из возможных в контроле событий?

Здравствуйте, Dronopotamus, Вы писали:

D>Здравствуйте, shepard, Вы писали:


S>>это понятно, только как это сделать? по такой схеме работает dotnetnuke, просто не хочется его исходники ковырять, может кто знает


D>я сталкивался с похожей проблемой

D>у меня есть набор элементов управления, они биндятся к данным с помощью своего механизма биндинга. Инициатором установки данных в контролы и сбора измененных является в конечном счете страница — т.е. если при этом возникает ексепшн — он ловится на странице и отображается как мне надо. Но также эксепшены могли возникать в событиях элементов управления, и поскольку евенты вызываются не из моей страницы, а из инфраструктуры асп.нет — приходилось ловить и обрабатывать их в самих контролах. Через какое-то время я понял, что это криво . Вынес из контролов всю логику, которая зажигалась на события и могла кидать ексепшены, наружу, в сами контролы добавил внятные события и подписываюсь на них на странице.
Re[5]: Обработка исключений контролов
От: cadet354 Россия
Дата: 24.07.06 09:12
Оценка:
Здравствуйте, shepard, Вы писали:

S>получу ли я при таком подходе исключение возникшее в обработчике нажатия кнопки в моем контроле, например?


нет конечно, разве по псевдокоду этого не видно , это при добавлении его на страницу.
Сейчас гляну как они делают если exception при обработке события
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Обработка исключений контролов
От: shepard  
Дата: 24.07.06 11:05
Оценка:
Видно, но закралось подозрение, вдруг я чего то не понимаю
буду премного благодарен (и не только я, мне кажется) если Вы раскажете как же это сделано в нюке

Здравствуйте, cadet354, Вы писали:

C>Здравствуйте, shepard, Вы писали:


S>>получу ли я при таком подходе исключение возникшее в обработчике нажатия кнопки в моем контроле, например?


C>нет конечно, разве по псевдокоду этого не видно , это при добавлении его на страницу.

C>Сейчас гляну как они делают если exception при обработке события
Re[7]: Обработка исключений контролов
От: cadet354 Россия
Дата: 24.07.06 14:24
Оценка: 3 (1)
Здравствуйте, shepard, Вы писали:

Прошу прощения за задержку(свои дедлайны),
что значит правильно писать код (оборачивая все в обертку:
Try
...
Catch exc As Exception   
ProcessModuleLoadException(Me, exc)
End Try

).
Страница default.aspx (dnn одностраничный портал), наследуется от PageBase,
в котором есть волшебный метод:
Private Sub Page_Error(ByVal Source As Object, ByVal e As System.EventArgs) Handles MyBase.Error
            Dim exc As Exception = Server.GetLastError
            Dim strURL As String = ApplicationURL()
            If Not Request.QueryString("error") Is Nothing Then
                strURL += IIf(strURL.IndexOf("?") = -1, "?", "&").ToString & "error=terminate"
            Else
                strURL += IIf(strURL.IndexOf("?") = -1, "?", "&").ToString & "error=" & Server.UrlEncode(exc.Message)
                If Not IsAdminControl() Then
                    strURL += "&content=0"
                End If
            End If
                ProcessPageLoadException(exc, strURL)
        End Sub

который как я подсветил жирным, перехватывает все необработанные exception на странице...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Обработка исключений контролов
От: kaer  
Дата: 25.07.06 03:49
Оценка:
Здравствуйте, cadet354, Вы писали:

C>Прошу прощения за задержку(свои дедлайны),

C>что значит правильно писать код (оборачивая все в обертку:
C>
C>Try
C>...
C>Catch exc As Exception   
C>ProcessModuleLoadException(Me, exc)
C>End Try 
C>

C>).
C>Страница default.aspx (dnn одностраничный портал), наследуется от PageBase,
C>в котором есть волшебный метод:
C>
C>Private Sub Page_Error(ByVal Source As Object, ByVal e As System.EventArgs) Handles MyBase.Error
C>            Dim exc As Exception = Server.GetLastError
C>            Dim strURL As String = ApplicationURL()
C>            If Not Request.QueryString("error") Is Nothing Then
C>                strURL += IIf(strURL.IndexOf("?") = -1, "?", "&").ToString & "error=terminate"
C>            Else
C>                strURL += IIf(strURL.IndexOf("?") = -1, "?", "&").ToString & "error=" & Server.UrlEncode(exc.Message)
C>                If Not IsAdminControl() Then
C>                    strURL += "&content=0"
C>                End If
C>            End If
C>                ProcessPageLoadException(exc, strURL)
C>        End Sub
C>

C>который как я подсветил жирным, перехватывает все необработанные exception на странице...

Что в свою очередь означает, что они перехватывают только ошибки времени загрузки контролов, если что-то сломалось на другом шаге цикла — мы вываливаемся на стандартный error page.
Re[9]: Обработка исключений контролов
От: cadet354 Россия
Дата: 25.07.06 05:01
Оценка:
Здравствуйте, kaer, Вы писали:


K>Что в свою очередь означает, что они перехватывают только ошибки времени загрузки контролов, если что-то сломалось на другом шаге цикла — мы вываливаемся на стандартный error page.


Неверно, они перехватывают все необработанные исключения на странице.
Вот цитата с MSDN:

Unhandled Exceptions
Earlier we mentioned that ASP.NET, or rather the CLR, forces us to deal with an exception when an error occurs. We obviously don't write Try/Catch/Finally blocks around all of our code, and in the cases where we don't, ASP.NET still provides us with some facilities for handling the exception through two events:

Page_Error
Application_Error
Page and Application Error Event Handlers
The case exists where an exception is unexpected and does not occur within the bounds of a Try/Catch/Finally block. These exceptions are usually an indicator that something is substantially wrong with the application. That is, some abnormal error has occurred and there is no graceful way to get out of the error. In these situations, where we don't wrap the faulty code with a Try/Catch/Finally block, we still have the option to deal with the error at either the Page or Application level.

If we choose to deal with the error at the Page level, we must provide an implementation for the Page_Error event:

VB.NET

Public Sub Page_Error(sender As Object, e As EventArgs)
' Implementation here
End Sub

C#

public void Page_Error(Object sender, EventArgs e) {
// Implementation here
}

This event is implemented within the Page that the error may occur within.

Alternatively, we can also implement the Application_Error event. Unlike the Page_Error event, the Application_Error event is implemented in global.asax and any unhandled exception that occurs within our application raises this event (if implemented):

VB.NET

Public Sub Application_Error(sender As Object, e As EventArgs)
' Implementation here
End Sub

C#

public void Application_Error(Object sender, EventArgs e) {
// Implementation here
}

Within either of these events, we can run code such as sending an e-mail to the administrator or writing to the event log noting that an error occurred. In the next column, we'll discuss writing to the Windows Event Log.

In addition to running code to alert necessary persons to the exception within our application, we still have the opportunity to massage the exception—clearing it if necessary. We have access to the exception that occurred through the Server.GetLastError() method which returns an Exception class, and we can clear the exception using the API Server.ClearError().

P.S. Ошибки времени загрузки контролов обрабатываются как я уже показал в псевдокоде
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
RE: Обработка исключений контролов
От: Аноним  
Дата: 21.07.06 12:15
Оценка:
Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?
используй try-catch
Есть многое на свете, друг Гораций, что непонятно нашим мудрецам.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[10]: Обработка исключений контролов
От: shepard  
Дата: 25.07.06 05:59
Оценка:
спасибо большое, теперь все ясно

>Здравствуйте, cadet354, Вы писали:
Re[11]: Обработка исключений контролов
От: kaer  
Дата: 25.07.06 08:56
Оценка:
Здравствуйте, shepard, Вы писали:

S>спасибо большое, теперь все ясно


>>Здравствуйте, cadet354, Вы писали:



Здорово Теперь если не трудно объясните, пожалуйста, мне что нужно дописать в метод Page_Error, чтобы вместо экрана с ошибкой отрендерилась обычная страница, как будто ничего не произошло, а на месте кнопки было "This control just crushed."


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        Button button = new Button();
        button.ID = "TestButton";
        button.Click += new EventHandler(button_Click);
        button.Text = "Puch me to get error.";

        this.Form.Controls.Add(button);

        this.Page.Error += new EventHandler(Page_Error);
    }

    void Page_Error(object sender, EventArgs e)
    {
        // ... ?
    }

    void button_Click(object sender, EventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}


Aspx — начинка от студии по умолчанию.
Re[12]: Обработка исключений контролов
От: Dronopotamus Россия  
Дата: 25.07.06 09:01
Оценка:
Здравствуйте, kaer, Вы писали:

K>Здорово Теперь если не трудно объясните, пожалуйста, мне что нужно дописать в метод Page_Error, чтобы вместо экрана с ошибкой отрендерилась обычная страница, как будто ничего не произошло, а на месте кнопки было "This control just crushed."


именно )
мне тоже очень интересно, я не нашел решения
когда ексепшн случается в потрохах (ProcessRequest) — перехватить его в OnError можно, но страница-то не рендерится дальше
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[13]: Обработка исключений контролов
От: Аноним  
Дата: 25.07.06 09:19
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

D>Здравствуйте, kaer, Вы писали:


K>>Здорово Теперь если не трудно объясните, пожалуйста, мне что нужно дописать в метод Page_Error, чтобы вместо экрана с ошибкой отрендерилась обычная страница, как будто ничего не произошло, а на месте кнопки было "This control just crushed."


D>именно )

D>мне тоже очень интересно, я не нашел решения
D>когда ексепшн случается в потрохах (ProcessRequest) — перехватить его в OnError можно, но страница-то не рендерится дальше

Поглядел тоже nuke.У них это сделано в контейнере(который представляет собой обертку для модулей), в нем проиcходит controls.add(), который обернут try catch. Т.о. у них рендерится страница дальше. Вопрос: если мы добавляем контролы не динамически, а кладем на форму реально ли написать такую обработку?
Re[14]: Обработка исключений контролов
От: kaer  
Дата: 25.07.06 09:48
Оценка: +1
Здравствуйте, Аноним, Вы писали:


А>Поглядел тоже nuke.У них это сделано в контейнере(который представляет собой обертку для модулей), в нем проиcходит controls.add(), который обернут try catch. Т.о. у них рендерится страница дальше.


Я ничего не говорю про try catch в момент add — да, если там будет прокинут exception — он будет отловлен и страница отрендерится.
Разговор идет о том, что добавление контрола на страницу — это только самое начало жизни контрола. Потом он разовьет бурную деятельность, и может накидать просто туеву хучу различных ошибок. И если их не отловить по месту — то call stack рендеринга страницы будет разрушен, состояние потеряно и ни о каком нормальном рендеринге речь не может идти.
Re[15]: Обработка исключений контролов
От: Аноним  
Дата: 25.07.06 10:34
Оценка:
Здравствуйте, kaer, Вы писали:

K>Здравствуйте, Аноним, Вы писали:



А>>Поглядел тоже nuke.У них это сделано в контейнере(который представляет собой обертку для модулей), в нем проиcходит controls.add(), который обернут try catch. Т.о. у них рендерится страница дальше.


K>Я ничего не говорю про try catch в момент add — да, если там будет прокинут exception — он будет отловлен и страница отрендерится.

K>Разговор идет о том, что добавление контрола на страницу — это только самое начало жизни контрола. Потом он разовьет бурную деятельность, и может накидать просто туеву хучу различных ошибок. И если их не отловить по месту — то call stack рендеринга страницы будет разрушен, состояние потеряно и ни о каком нормальном рендеринге речь не может идти.

Так и я о том же и говорю. В конце поста вопрос. Я пока также не нашел решение.
Re[2]: Обработка исключений контролов
От: shepard  
Дата: 25.07.06 12:56
Оценка:
Эврика!!! спасибо

Здравствуйте, Max Pro, Вы писали:

MP>Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?

MP>используй try-catch
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.