Можно ли написать базовый класс для обработки исключения nullReferenceException со всех страниц?

Я использую .net framework 4.0, простой asp.net и работаю с веб-формой. В настоящее время у меня есть базовый класс для обработки всех параметров и перенаправления. Интересно, можно ли написать базовый класс для обработки исключения nullRefeerenceException со всех страниц за один раз, скажем, перенаправить конечного пользователя куда-нибудь или отобразить конкретное сообщение об ошибке.

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


person SƲmmēr Aƥ    schedule 08.02.2012    source источник
comment
Перенаправление на страницы с ошибками — плохая идея. Вы должны отображать ошибки на месте с соответствующим кодом ошибки (5xx в вашем случае, так как это ошибка на сервере)   -  person CodesInChaos    schedule 08.02.2012
comment
Существует также важный вопрос, какую часть asp.net вы используете. Обычный asp.net, WebForms, Asp.net MVC или какой-то другой фреймворк?   -  person CodesInChaos    schedule 08.02.2012
comment
@CodeInChaos я добавил в пример объявления   -  person SƲmmēr Aƥ    schedule 08.02.2012
comment
Вы до сих пор не сказали, какой фреймворк вы используете. Проверка ввода в Asp.net MVC работает совсем не так, как в WebForms и т. д.   -  person CodesInChaos    schedule 08.02.2012
comment
opps, извините за это и снова обновился. Я не знаю, что это может быть очень важной проблемой и вызвать разницу. Спасибо, что сказал мне.   -  person SƲmmēr Aƥ    schedule 08.02.2012
comment
давайте продолжим это обсуждение в чате   -  person SƲmmēr Aƥ    schedule 08.02.2012


Ответы (4)


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

public override void ProcessRequest(HttpContext context)
{
    try
    {
        base.ProcessRequest(context);
    }
    catch (Exception x)
    {
        // handle here your error from the page...
    }
}

Еще несколько заметок

Я использовал этот код на одной критической странице, но я не использую его для всей своей страницы. Несмотря на то, что вы можете зафиксировать ошибки, иногда вы не можете ничего сделать здесь, кроме как снова выдать окончательную ошибку, поэтому в конечном итоге лучше зарегистрировать свои неизвестные и необработанные ошибки из globa.asax Application_Error, а на странице убедитесь, что вы используете try/catch чтобы справиться с ними, где они происходят.

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

Последний

Вы также получаете здесь ошибку throw, когда пользователь закрывает соединение до окончания рендеринга, но если вы регистрируете ошибки, вы получаете то же самое на Application_Error - это не ошибка страницы.

    Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> 
   System.Web.HttpException: The remote host closed the connection. 
   The error code is 0x80072746.
person Aristos    schedule 08.02.2012
comment
Отлично, это может быть то, что я ищу! у вас есть пример? - person SƲmmēr Aƥ; 08.02.2012
comment
Использовать редирект 3xx — плохая идея. Вы должны напрямую вернуть код ошибки и отобразить страницу ошибки. - person CodesInChaos; 08.02.2012
comment
@SƲmmērAƥ Вот пример! и рабочий код. Я использовал, и он работает хорошо. - person Aristos; 08.02.2012
comment
@CodeInChaos Это пример, вы можете делать все, что захотите. Идея в том, что я отвечаю, точка, чтобы захватить процесс страницы. - person Aristos; 08.02.2012
comment
Проблема с примером кода в том, что люди будут копировать и вставлять его с минимальными изменениями. Поэтому я стараюсь избегать плохих практик, особенно в примере кода. - person CodesInChaos; 08.02.2012
comment
тем не менее, я надеюсь услышать от вас обоих любое предложенное решение. - person SƲmmēr Aƥ; 08.02.2012
comment
@CodeInChaos Хорошо, я делаю это более общим - person Aristos; 08.02.2012

В вашем Global.asax обработайте Application_Error.

person Joe Enzminger    schedule 08.02.2012

Когда NullReferenceException обрабатывается сервером, создается ответ 500. Перенаправьте все сообщения вашего сервера 500, как вы хотите. Это руководство поможет.

Полное руководство по обработке 500 ошибок в IIS6, IIS7, ASP.NET MVC3 с настраиваемой страницей

person Paul Nikonowicz    schedule 08.02.2012

Вы можете подключиться к каждому неперехваченному исключению NullReference Exception, в зависимости от того, что вы хотите сделать.

Например, вы можете использовать global.asax для конкретного события Application_Error. Можно получить ссылку на исключение, поискать тип и выполнить там редирект.

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

person citronas    schedule 08.02.2012