Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Обработка исключений контролов / 24 сообщений из 24, страница 1 из 1
21.07.2006, 12:58
    #33869769
shepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?
...
Рейтинг: 0 / 0
21.07.2006, 16:15
    #33870706
Max Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?
используй try-catch
Есть многое на свете, друг Гораций, что непонятно нашим мудрецам.
...
Рейтинг: 0 / 0
23.07.2006, 10:08
    #33872241
kaer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, shepard, Вы писали:

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

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

В любом случае, на мой взгляд, игра не стоит свеч :) Все равно если развалилась одна часть интерфейса — то вторая может настолько непредсказуемо себя повести, что что-нибудь может сломаться окончательно :) В данном случае лучше подход — "умерла, так умерла". Цель — чтобы не умирала вовсе :)
...
Рейтинг: 0 / 0
24.07.2006, 10:00
    #33872920
shepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, kaer, Вы писали:

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

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

это понятно, только как это сделать? по такой схеме работает dotnetnuke, просто не хочется его исходники ковырять, может кто знает :)
...
Рейтинг: 0 / 0
24.07.2006, 11:02
    #33873086
Dronopotamus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, shepard, Вы писали:

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

я сталкивался с похожей проблемой
у меня есть набор элементов управления, они биндятся к данным с помощью своего механизма биндинга. Инициатором установки данных в контролы и сбора измененных является в конечном счете страница — т.е. если при этом возникает ексепшн — он ловится на странице и отображается как мне надо. Но также эксепшены могли возникать в событиях элементов управления, и поскольку евенты вызываются не из моей страницы, а из инфраструктуры асп.нет — приходилось ловить и обрабатывать их в самих контролах. Через какое-то время я понял, что это криво :). Вынес из контролов всю логику, которая зажигалась на события и могла кидать ексепшены, наружу, в сами контролы добавил внятные события и подписываюсь на них на странице.... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
24.07.2006, 11:05
    #33873099
cadet354
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, 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>>
...
Рейтинг: 0 / 0
24.07.2006, 11:11
    #33873123
shepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
получу ли я при таком подходе исключение возникшее в обработчике нажатия кнопки в моем контроле, например?

Здравствуйте, 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>
...
Рейтинг: 0 / 0
24.07.2006, 11:18
    #33873140
shepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
то есть грубо говоря, на странице ловить исключения в каждом из возможных в контроле событий?

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

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

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

D>я сталкивался с похожей проблемой
D>у меня есть набор элементов управления, они биндятся к данным с помощью своего механизма биндинга. Инициатором установки данных в контролы и сбора измененных является в конечном счете страница — т.е. если при этом возникает ексепшн — он ловится на странице и отображается как мне надо. Но также эксепшены могли возникать в событиях элементов управления, и поскольку евенты вызываются не из моей страницы, а из инфраструктуры асп.нет — приходилось ловить и обрабатывать их в самих контролах. Через какое-то время я понял, что это криво :). Вынес из контролов всю логику, которая зажигалась на события и могла кидать ексепшены, наружу, в сами контролы добавил внятные события и подписываюсь на них на странице.
...
Рейтинг: 0 / 0
24.07.2006, 13:12
    #33873627
cadet354
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, shepard, Вы писали:

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

нет конечно, разве по псевдокоду этого не видно :) , это при добавлении его на страницу.
Сейчас гляну как они делают если exception при обработке события... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
24.07.2006, 15:05
    #33874118
shepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Видно, но закралось подозрение, вдруг я чего то не понимаю ;)
буду премного благодарен (и не только я, мне кажется) если Вы раскажете как же это сделано в нюке :)

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

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

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

C>нет конечно, разве по псевдокоду этого не видно :) , это при добавлении его на страницу.
C>Сейчас гляну как они делают если exception при обработке события
...
Рейтинг: 0 / 0
24.07.2006, 18:24
    #33874869
cadet354
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, 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>>
...
Рейтинг: 0 / 0
25.07.2006, 07:49
    #33875400
kaer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, 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.
...
Рейтинг: 0 / 0
25.07.2006, 09:01
    #33875490
cadet354
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, 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>>
...
Рейтинг: 0 / 0
25.07.2006, 09:59
    #33875627
shepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
спасибо большое, теперь все ясно :)

>Здравствуйте, cadet354, Вы писали:
...
Рейтинг: 0 / 0
25.07.2006, 12:56
    #33876444
kaer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, 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 — начинка от студии по умолчанию.
...
Рейтинг: 0 / 0
25.07.2006, 13:01
    #33876477
Dronopotamus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, kaer, Вы писали:

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

именно )
мне тоже очень интересно, я не нашел решения :)
когда ексепшн случается в потрохах (ProcessRequest) — перехватить его в OnError можно, но страница-то не рендерится дальше... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
25.07.2006, 13:19
    #33876568
Аноним
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, Dronopotamus, Вы писали:

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

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

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

Поглядел тоже nuke.У них это сделано в контейнере(который представляет собой обертку для модулей), в нем проиcходит controls.add(), который обернут try catch. Т.о. у них рендерится страница дальше. Вопрос: если мы добавляем контролы не динамически, а кладем на форму реально ли написать такую обработку?
...
Рейтинг: 0 / 0
25.07.2006, 13:48
    #33876697
kaer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, Аноним, Вы писали:


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

Я ничего не говорю про try catch в момент add — да, если там будет прокинут exception — он будет отловлен и страница отрендерится.
Разговор идет о том, что добавление контрола на страницу — это только самое начало жизни контрола. Потом он разовьет бурную деятельность, и может накидать просто туеву хучу различных ошибок. И если их не отловить по месту — то call stack рендеринга страницы будет разрушен, состояние потеряно и ни о каком нормальном рендеринге речь не может идти.
...
Рейтинг: 0 / 0
25.07.2006, 14:34
    #33876897
Аноним
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, kaer, Вы писали:

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


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

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

Так и я о том же и говорю. :)) В конце поста вопрос. Я пока также не нашел решение.
...
Рейтинг: 0 / 0
25.07.2006, 16:56
    #33877532
shepard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Эврика!!! спасибо :))

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

MP>Как сделать так, чтобы я на странице мог на месте какого либо контрола, выводить exception который в нем произошел, а не получать ошибку на всю страницу?
MP>используй try-catch
...
Рейтинг: 0 / 0
26.07.2006, 08:57
    #33878380
cadet354
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, kaer, Вы писали:

K>Здорово :) Теперь если не трудно объясните,
трудно и сейчас нет времени, shepard спрашивал как это происходит в dnn, я думаю, что ответил на его вопрос.
K> пожалуйста, мне что нужно дописать в метод Page_Error,
можно анализировать request, смотреть что вызвало postback, находить номер модуля, перегрузить построение страницы в dnn, и вместо контрола рейдить надпись.
K> чтобы вместо экрана с ошибкой отрендерилась обычная страница, как будто ничего не произошло, а на месте кнопки было "This control just crushed."
P.S.Обьясните, что это за религия, которая не позволяет обработку события в контроле делать с помощью следующего блока:

Try
    'тут ваш код
Catch exc As Exception   
    ProcessModuleLoadException(Me, exc)
End Try... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
26.07.2006, 13:11
    #33879381
kaer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, cadet354, Вы писали:

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

K>>Здорово :) Теперь если не трудно объясните,
C>трудно и сейчас нет времени, shepard спрашивал как это происходит в dnn, я думаю, что ответил на его вопрос.
K>> пожалуйста, мне что нужно дописать в метод Page_Error,
C>можно анализировать request, смотреть что вызвало postback, находить номер модуля, перегрузить построение страницы в dnn, и вместо контрола рейдить надпись.

Да, это вариант. Проблема только в том, что без этого контрола другой зависящий от него контрол может получить невалидное состояние, и придется делать еще один request — уже с новым отвалишимся контролом...
В результате имеем неочевидный движок, который сам может рухнуть не раз и который нужно хорошо отладить. Получаем ограничение в интерфейсе на как можно более независимые блоки (что не всегда возможно и часто просто вредно). А самое забавное, что мы имеем скорее всего абсолютно бесполезную для пользователя фичу — "экран развалился наполовину" :)

K>> чтобы вместо экрана с ошибкой отрендерилась обычная страница, как будто ничего не произошло, а на месте кнопки было "This control just crushed."
C>P.S.Обьясните, что это за религия, которая не позволяет обработку события в контроле делать с помощью следующего блока:
C>
C>Try
C>    'тут ваш код
C>Catch exc As Exception   
C>    ProcessModuleLoadException(Me, exc)
C>End Try
C>

Ничего не мешает :) Более того, все exception'ы, которые являются просто сообщениями для UI из более глубоких слоев — обязательно нужно поймать и корректно обработать. Но когда шлепнулось ХренЗнаетЧто типа System.Exception, то никакого дальнейшего рендеринга делать нафиг не надо — error page и все.
Цель программиста — исключить такие ситуации :)
...
Рейтинг: 0 / 0
26.07.2006, 15:59
    #33880099
cadet354
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, kaer, Вы писали:

K>Ничего не мешает :) Более того, все exception'ы, которые являются просто сообщениями
это как?
K> для UI из более глубоких слоев — обязательно нужно поймать и корректно обработать. Но когда шлепнулось ХренЗнаетЧто типа System.Exception, то никакого дальнейшего рендеринга делать нафиг не надо — error page и все.
хотелось бы увидеть пример вот этого ХренЗнаетЧто
ну так dnn делает рейдеринг на страницу с ошибкой если ты исключения не обрабатываешь
K>Цель программиста — исключить такие ситуации :)
согласен... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
...
Рейтинг: 0 / 0
26.07.2006, 16:50
    #33880297
kaer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка исключений контролов
Здравствуйте, cadet354, Вы писали:

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

K>>Ничего не мешает :) Более того, все exception'ы, которые являются просто сообщениями
C>это как?

DataConstrainException — "Account with this login already registered"

K>> для UI из более глубоких слоев — обязательно нужно поймать и корректно обработать. Но когда шлепнулось ХренЗнаетЧто типа System.Exception, то никакого дальнейшего рендеринга делать нафиг не надо — error page и все.
C>хотелось бы увидеть пример вот этого ХренЗнаетЧто

NullRefenrenceException

C>ну так dnn делает рейдеринг на страницу с ошибкой если ты исключения не обрабатываешь

Правильно делают :)
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Обработка исключений контролов / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]